Win32 tehtäviä perusteet vastaus4
Mureakuha
Tehtävänanto oli:
Kirjoita ohjelma, jossa on kaksi vierityspalkkia. Niiden asemaa pystyy hiirellä muuttamaan naputtelemalla kuilusta, palkin päistä tai siirtämällä hissilaatikkoa. Palkkien vieritysväli on 0 - 10000 ja kummankin palkin sen hetkinen tilanne tulostetaan static-ikkunaluokan kontrolliin riippuen siitä kumpaa palkkia käyttäjä viimeksi muutti.
#include <windows.h> #include <stdlib.h> 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 }
Tämän dokumentin kopiointi, levittäminen sekä muokkaaminen on sallittua GNU Free Documentation Licensen version 1.2 tai uudemman Free Software Foundationin julkaiseman version mukaisesti, ilman muuttumattomuuslauseketta tai kansitekstejä. Tätä koskee vastuuvapaus.
Kopio lisenssistä (englanniksi) löytyy täältä.
Kopio lisenssistä (englanniksi) löytyy täältä.
Alkuperäinen (c) Petteri Hämäläinen
