Win32 tehtäviä perusteet vastaus3
Mureakuha
Tehtävänanto oli:
Kirjoita ohjelma, jossa on kaksi button-ikkunaluokan BS_AUTOCHECKBOX ja BS_AUTORADIOBUTTON tyylin kontrollia. Näiden tila tutkitaan painettaessa kyseisiä painonappeja ja tulos tulostetaan static-ikkunaluokan kontrolleihin.
#include <windows.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[] = "CheckRadio" ; // '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 "Checkbox & Radiobutton", // 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 hwndStaticRadio, hwndStaticCheck1, hwndStaticCheck2, hwndButtonRadio, hwndButtonCheck, hwndRadio2, hwndRadio1, hwndCheck2, hwndCheck1; // kahvat switch (iMsg) // sanomien käsittelyrakenne { case WM_CREATE: // initialisaatiosanoma CreateWindow("button", NULL, WS_CHILD|WS_VISIBLE|BS_GROUPBOX, 10, 10, 473, 255, hwnd, (HMENU) 0, hInstance, NULL); // kehys hwndCheck1=CreateWindow("button", "AutoCheck1", WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX, 110, 50, 100, 20, hwnd, (HMENU) 1, hInstance, NULL); // Valintaruutu hwndCheck2=CreateWindow("button", "AutoCheck2", WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX, 110, 70, 100, 20, hwnd, (HMENU) 2, hInstance, NULL); // Valintaruutu hwndRadio1=CreateWindow("button", "AutoRadio1", WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON, 280, 50, 100, 20, hwnd, (HMENU) 3, hInstance, NULL); // Valintanappi SendMessage(hwndRadio1, BM_SETCHECK, 1, 0); // tehdään oletusvalinta hwndRadio2=CreateWindow("button", "AutoRadio2", WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON, 280, 70, 100, 20, hwnd, (HMENU) 4, hInstance, NULL); // Valintanappi hwndButtonCheck=CreateWindow("button", "Check", WS_CHILD|WS_VISIBLE, 110, 120, 100, 30, hwnd, (HMENU) 5, hInstance, NULL); // painonappi hwndButtonRadio=CreateWindow("button", "Radio", WS_CHILD|WS_VISIBLE, 280, 120, 100, 30, hwnd, (HMENU) 6, hInstance, NULL); // painonappi hwndStaticCheck1=CreateWindowEx(WS_EX_STATICEDGE, "static", "Check1 pois", WS_CHILD|WS_VISIBLE, 110, 170, 100, 20, hwnd, (HMENU) 7, hInstance, NULL); // tekstinlaatikko hwndStaticCheck2=CreateWindowEx(WS_EX_STATICEDGE, "static", "Check2 pois", WS_CHILD|WS_VISIBLE, 110, 200, 100, 20, hwnd, (HMENU) 8, hInstance, NULL); // tekstinlaatikko hwndStaticRadio=CreateWindowEx(WS_EX_STATICEDGE, "static", "Radio1 päällä", WS_CHILD|WS_VISIBLE, 280, 170, 100, 20, hwnd, (HMENU) 9, hInstance, NULL); // tekstinlaatikko return 0 ; case WM_COMMAND: switch HIWORD(wParam) // tapahtumatunnus { case BN_CLICKED: // tapahtumatunnus BN_CLICKED = nappia on painettu if ( LOWORD(wParam) == 5 && SendMessage(hwndCheck1, BM_GETCHECK, 0,0) == TRUE) SetWindowText(hwndStaticCheck1, "Check1 päällä"); // BM_GETCHECK = valintaruudun tila if ( LOWORD(wParam) == 5 && SendMessage(hwndCheck1, BM_GETCHECK, 0,0) == FALSE) SetWindowText(hwndStaticCheck1, "Check1 pois "); if ( LOWORD(wParam) == 5 && SendMessage(hwndCheck2, BM_GETCHECK, 0,0) == TRUE) SetWindowText(hwndStaticCheck2, "Check2 päällä"); // BM_GETCHECK = valintaruudun tila if ( LOWORD(wParam) == 5 && SendMessage(hwndCheck2, BM_GETCHECK, 0,0) == FALSE) SetWindowText(hwndStaticCheck2, "Check2 pois"); if ( LOWORD(wParam) == 6 && SendMessage(hwndRadio1, BM_GETCHECK, 0,0) == TRUE) SetWindowText(hwndStaticRadio, "Radio1 päällä"); // BM_GETCHECK = valintanapin tila if ( LOWORD(wParam) == 6 && SendMessage(hwndRadio2, BM_GETCHECK, 0,0) == TRUE) SetWindowText(hwndStaticRadio, "Radio2 päällä "); } 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
