Win32 tehtäviä syventävät vastaus1
Mureakuha
Tehtävä:
Kirjoita ohjelma, jossa käyttäjä voi valita lottonumerot. Ohjelmassa on luetteloruutu, kymmenen staattista tekstiruutua numeroille ja kaksi kuvassa olevalle tekstille ja nappi. Luetteloruudusta voi tuplanaputtamalla valita oikeat numerot ja ne tulevat oikeassa järjestyksessä, alusta alkaen omiin lokeroihinsa. 'Reset'-nappi käynnistää ohjelman uudestaan. Se siis kirjoittaa luetteloruudun numerot uudelleen ja tyhjentää numerolaatikot.
#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[] = "Lottonumerot" ; // '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 "Lottonumerot", // 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 hwndList, hwndStatic[10], hwndButton; // kahvat char bufferi[10] ; // tilapäinen merkkijonomuuttuja static int i = 0 ; // laskuri 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); // koristelaatikko lomakkeella hwndList=CreateWindowEx(WS_EX_CLIENTEDGE,"listbox", NULL, WS_CHILD|WS_VISIBLE|LBS_MULTICOLUMN|LBS_NOTIFY, 40, 50, 413, 130, hwnd, (HMENU) 1, hInstance, NULL); // luetteloruutu SendMessage ( hwndList, LB_SETCOLUMNWIDTH, 68, 0 ) ; // asetetaan kolumnit luetteloruutuun for (i=1 ; i <= 39 ; i ++) // lasketaan lottonumerot luetteloruutuun { char merkki[2] ; itoa ( i, merkki, 10 ) ; // tietotyypin muutos SendMessage ( hwndList, LB_ADDSTRING, 0, (LPARAM) merkki ) ; // lisätään rivi } CreateWindow("static", "Numerot:", WS_CHILD|WS_VISIBLE, 40, 191, 70, 22, hwnd, (HMENU) 0, hInstance, NULL); // staattinen tekstilaatikko CreateWindow("static", "Lisänumerot:", WS_CHILD|WS_VISIBLE, 40, 223, 110, 22, hwnd, (HMENU) 0, hInstance, NULL); // staattinen tekstilaatikko for (i=0 ; i <= 6 ; i ++) hwndStatic[i]=CreateWindowEx(WS_EX_CLIENTEDGE, "static", NULL, WS_CHILD|WS_VISIBLE|SS_CENTER, 130+40*i, 191, 30, 22, hwnd, (HMENU) 0, hInstance, NULL); // staattinen tekstinlaatikko for (i=7 ; i <= 9 ; i ++) hwndStatic[i]=CreateWindowEx(WS_EX_CLIENTEDGE, "static", NULL, WS_CHILD|WS_VISIBLE|SS_CENTER, 130+40*(i-7), 223, 30, 22, hwnd, (HMENU) 0, hInstance, NULL); // staattinen tekstinlaatikko hwndButton=CreateWindow("button", "Reset", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 360, 220, 100, 28, hwnd, (HMENU) 99, hInstance, NULL); // painonappi i = 0 ; // nollataan laskuri return 0 ; } case WM_COMMAND : switch HIWORD(wParam) // tässä palautuu tapahtumatunnus { case LBN_DBLCLK: // tapahtumatunnus LBN_DBLCLK = listaa on tuplanautettu SendMessage (hwndList, LB_GETTEXT, SendMessage (hwndList, LB_GETCURSEL, 0, 0), (LPARAM) bufferi); // haetaan valittu teksti SetWindowText (hwndStatic[i], bufferi) ; // kirjoitetaan teksti SendMessage (hwndList, LB_DELETESTRING, SendMessage (hwndList, LB_GETCURSEL, 0, 0), 0) ; // poistetaan rivi i++ ; // lisätään laskuria if (i == 10) EnableWindow (hwndList, FALSE) ; // kun kaikki numerot on valittu, poistetaan lista käytöstä return 0 ; case BN_CLICKED: // reset-nappia on painettu for (i=0 ; i <= 9 ; i ++) // kirjoitetaan tyhjää SetWindowText (hwndStatic[i], NULL) ; EnableWindow (hwndList, TRUE); // avataan luetteloruutu... SendMessage (hwndList, LB_RESETCONTENT, 0, 0) ; // ...tyhjennetään se... for (i=1 ; i <= 39 ; i ++) // ...ja täytetään uudestaan { char merkki[2] ; itoa ( i, merkki, 10 ) ; SendMessage ( hwndList, LB_ADDSTRING, 0, (LPARAM) merkki ) ; } i=0 ; return 0 ; } return 0 ; case WM_DESTROY : // lopetussanoman käsittely 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
