#include #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; // ikkunaproseduurin esittely HINSTANCE hInstance; // globaali ohjelman ilmentymän kahva int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static char szAppName[] = "Vierityspalkki" ; // 'ohjelman nimi' HWND hwnd ; // kahvamuuttuja MSG msg ; // sanomastrukstuuri WNDCLASSEX wndclass ; // ikkunan luokkastruktuuri wndclass.cbSize = sizeof (wndclass) ; // struktuurin koko wndclass.style = CS_HREDRAW | CS_VREDRAW ; // ikkunan tyyli wndclass.lpfnWndProc = WndProc ; // ikkunaproseduurin nimi wndclass.cbClsExtra = 0 ; // ikkunan luokan sisältä ohjelman... wndclass.cbWndExtra = 0 ; // ...omaan käyttöön varattua tilaa wndclass.hInstance = hInstance ; // lomakkeen kahva wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; // ikoni wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; // kursori wndclass.hbrBackground = (HBRUSH) COLOR_WINDOW ; // taustaväri wndclass.lpszMenuName = NULL ; // valikon kahva wndclass.lpszClassName = szAppName ; // ikkunan luokan nimi wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION) ; // pieni ikoni RegisterClassEx (&wndclass) ; // ikkunan luokan rekisteröinti hwnd = CreateWindow (szAppName, // ikkunan luokan nimi "Vierityspalkki", // ikkunan otsikko WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU, // ikkunan tyyli CW_USEDEFAULT, // x-positio aluksi CW_USEDEFAULT, // y-positio aluksi 500, // leveys aluksi 300, // korkeus aluksi NULL, // emoikkunan kahva NULL, // ikkunan valikon kahva hInstance, // ohjelman ilmentymän kahva NULL) ; // luontiparametrit ShowWindow (hwnd, iCmdShow) ; // ikkunan piirto UpdateWindow (hwnd) ; // ikkunan päivitys while (GetMessage (&msg, NULL, 0, 0)) // sanomasilmukan alku { TranslateMessage (&msg) ; // viestien käsittely ja... DispatchMessage (&msg) ; // ...ikkunaproseduurin kutsu } return msg.wParam ; // käyttöjärjestelmälle palautettava arvo } LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { static HWND hwndStatic, hwndVScroll, hwndHScroll ; // kahvat static int vpositio = 0, hpositio = 0; // palkkien tila static char bufferi[10] = {NULL} ; // tulostettava numero pitää muuttaa tekstiksi switch (iMsg) // sanomien käsittelyrakenne { case WM_CREATE : // initialisaatiosanoma CreateWindow ("button", NULL, WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 10, 10, 472, 255, hwnd, (HMENU) 1, hInstance, NULL) ; // kehys hwndVScroll = CreateWindow ("scrollbar", NULL, WS_CHILD | WS_VISIBLE | SBS_VERT, 170, 60, 20, 140, hwnd, (HMENU) 2, hInstance, NULL) ; // pystysuuntainen vierityspalkki SetScrollRange (hwndVScroll, SB_CTL, 0, 10000, TRUE) ; // palkin vieritysalue hwndHScroll = CreateWindow ("scrollbar", NULL, WS_CHILD | WS_VISIBLE | SBS_HORZ, 210, 120, 140, 20, hwnd, (HMENU) 3, hInstance, NULL) ; // vaakasuuntainen vierityspalkki SetScrollRange (hwndHScroll, SB_CTL, 0, 10000, TRUE) ; // palkin vieritysalue hwndStatic = CreateWindowEx (WS_EX_STATICEDGE, "static", "Static kontrolli", WS_CHILD | WS_VISIBLE | SS_CENTER, 20, 235, 450, 20, hwnd, (HMENU) 4, hInstance, NULL) ; // tekstinlaatikko return 0 ; // pois ikkunaproseduurista case WM_VSCROLL: // pystysuuntainen vierityspalkki switch (LOWORD(wParam)) // tässä palautuu tapahtumatunnus { case SB_PAGEDOWN : // palkin kuilua napautettiin vpositio = vpositio + 24; // muutetaan palkin asema uudelleen case SB_LINEDOWN : // palkin vieritysnappia napautettiin vpositio = min( 10000, vpositio + 1); // positio ei saa liukua ohi 10000 break; case SB_PAGEUP : // palkin kuilua napautettiin vpositio = vpositio - 24; // muutetaan palkin asema uudelleen case SB_LINEUP : // palkin vieritysnappia napautettiin vpositio = max(0, vpositio - 1); // positio ei saa liukua ohi 0 break; case SB_THUMBPOSITION : // palkkia siirretään hissistä case SB_THUMBTRACK : // palkkia siirretään hissistä vpositio = HIWORD(wParam) ; // HIWORD(wParam) = uusi asema break; } SetScrollPos (hwndVScroll, SB_CTL, vpositio, TRUE) ; // asetetaan palkin asemaksi paikka johon käyttäjä hissin siirsi SetWindowText (hwndStatic, itoa (vpositio, bufferi, 10)) ; // tulostetaan numero tekstiruutuun return 0; case WM_HSCROLL: // vaakasuuntainen vierityspalkki switch (LOWORD(wParam)) // tässä palautuu tapahtumatunnus { case SB_PAGEDOWN : // palkin kuilua napautettiin hpositio = hpositio + 24; // muutetaan palkin asemaa case SB_LINEDOWN : // palkin vieritysnappia napautettiin hpositio = min(10000, hpositio + 1);// positio ei saa liukua ohi 10000 break; case SB_PAGEUP : // palkin kuilua napautettiin hpositio = hpositio - 24; // muutetaan palkin asemaa case SB_LINEUP : // palkin vieritysnappia napautettiin hpositio = max(0, hpositio - 1); // positio ei saa liukua ohi 0 break; case SB_THUMBPOSITION : // palkkia siirretään hissistä case SB_THUMBTRACK : // palkkia siirretään hissistä hpositio = HIWORD(wParam) ; // HIWORD(wParam) = uusi asema break; } SetScrollPos ( hwndHScroll, SB_CTL, hpositio, TRUE ) ; // asettaa palkin asemaksi paikan johon käyttäjä hissin siirsi SetWindowText ( hwndStatic, itoa (hpositio, bufferi, 10) ) ; // tulostetaan numero tekstiruutuun return 0; case WM_DESTROY : // lopetussanoma PostQuitMessage (0) ; // lopetusviesti Windowsille return 0 ; // pois ikkunaproseduurista } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; // sanomien oletuskäsittely }