Win32 tehtäviä syventävät vastaus2
Mureakuha
Tehtävä:
Kirjoita ohjelma, jossa on editbox ja listbox. Edittiin kirjoitettu teksti voidaan lisätä listboxiin 'Lisää listaan' -napilla. Listasta voidaan poistaa rivi tuplanapauttamalla tai 'Poista rivi'-napilla. Listan voi tyhjentää 'Tyhjennä lista'-napilla. Tilarivillä seurataan kokoajan tapahtumia siten, että kun käyttäjä tekee jotain sinne tulee ilmoitus tapauksesta kuten 'lisäsit rivin listaan', 'tyhjensit listan' jne. Oikeanpuoleisessa pikkulokerossa seurataan listboxin rivien lukumäärää. Ohjelman täytyy pystyä myös muuttamaan kontrollien kokoa kun lomakkeen kokoa muutetaan. Huomaa myös oikea fontti.
#include <windows.h> #include <commctrl.h> // yleisten kontrollien otsikkotiedosto HINSTANCE hInstance; LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; // ikkunaproseduurin esittely int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static char szAppName[ ] = "EditList" ; // '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 "Rivien lisäys", // ikkunan otsikko WS_OVERLAPPEDWINDOW, // 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 InitCommonControls ( ) ; // yleisten kontrollien rekisteröinti 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 hwndStatus, hwndList1, hwndEdit, hwndGroupbox, hwndButton1, hwndButton2, hwndButton3 ; static int lokerot[2] ; // tilarivin lokerot static char buffer[100] ; static int index, rivit = 8 ; switch (iMsg) // sanomien käsittelyrakenne { case WM_CREATE : // initialisaatiosanoman käsittely { HFONT hFont = GetStockObject (DEFAULT_GUI_FONT) ; // kysytään oletusfontin kahva hwndGroupbox = CreateWindow ("button", NULL, WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 0, 0, 0, 0, hwnd, (HMENU) 1, hInstance, NULL) ; hwndEdit = CreateWindowEx (WS_EX_CLIENTEDGE, "edit", "Aloita...", WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL, 0, 0, 0, 0, hwnd, (HMENU) 2, hInstance, NULL) ; SendMessage ( hwndEdit, WM_SETFONT, (WPARAM) hFont, MAKELPARAM(TRUE, 0) ) ; hwndButton1 = CreateWindow ("button", "Lisää listaan", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 0, 0, 0, 0, hwnd, (HMENU) 3, hInstance, NULL) ; SendMessage ( hwndButton1, WM_SETFONT, (WPARAM) hFont, MAKELPARAM(TRUE, 0) ) ; hwndList1 = CreateWindowEx (WS_EX_CLIENTEDGE, "listbox", NULL, WS_CHILD | WS_VISIBLE | LBS_STANDARD, 0, 0, 0, 0, hwnd, (HMENU) 4, hInstance, NULL) ; SendMessage ( hwndList1, WM_SETFONT, (WPARAM) hFont, MAKELPARAM(TRUE, 0) ) ; SendMessage ( hwndList1, LB_ADDSTRING, 0, (LPARAM) "Antti" ) ; SendMessage ( hwndList1, LB_ADDSTRING, 0, (LPARAM) "Kaija" ) ; SendMessage ( hwndList1, LB_ADDSTRING, 0, (LPARAM) "Mikko" ) ; SendMessage ( hwndList1, LB_ADDSTRING, 0, (LPARAM) "Pekka" ) ; SendMessage ( hwndList1, LB_ADDSTRING, 0, (LPARAM) "Liisa" ) ; SendMessage ( hwndList1, LB_ADDSTRING, 0, (LPARAM) "Jussi" ) ; SendMessage ( hwndList1, LB_ADDSTRING, 0, (LPARAM) "Tiina" ) ; SendMessage ( hwndList1, LB_ADDSTRING, 0, (LPARAM) "Susanna" ) ; hwndButton2 = CreateWindow ("button", "Poista rivi", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 0, 0, 0, 0, hwnd, (HMENU) 5, hInstance, NULL) ; SendMessage ( hwndButton2, WM_SETFONT, (WPARAM) hFont, MAKELPARAM(TRUE, 0) ) ; hwndButton3 = CreateWindow ("button", "Tyhjennä lista", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 0, 0, 0, 0, hwnd, (HMENU) 6, hInstance, NULL) ; SendMessage ( hwndButton3, WM_SETFONT, (WPARAM) hFont, MAKELPARAM(TRUE, 0) ) ; hwndStatus = CreateWindowEx ( NULL, STATUSCLASSNAME, "Aloita...", WS_CHILD | WS_VISIBLE | CCS_BOTTOM | SBARS_SIZEGRIP, 0, 0, 0, 0, hwnd, (HMENU) 7, hInstance, NULL ) ; SendMessage ( hwndStatus, WM_SETFONT, (WPARAM) hFont, MAKELPARAM(TRUE, 0) ) ; SendMessage ( hwndStatus, SB_SETPARTS, 2, (LPARAM) lokerot ) ; itoa(rivit, buffer, 10); SendMessage ( hwndStatus, SB_SETTEXT, 1, (LPARAM) buffer ) ; return 0 ; } case WM_SIZE : // ikkunan kokoa muutetaan lokerot[0] = LOWORD(lParam) - 100 ; lokerot[1] = LOWORD(lParam) ; MoveWindow ( hwndGroupbox, 10, 10, LOWORD(lParam)-20, HIWORD(lParam)-35, TRUE ) ; MoveWindow ( hwndEdit, 50, 50, LOWORD(lParam)-250, 19, TRUE ) ; MoveWindow ( hwndList1, 50, 100, LOWORD(lParam)-250, HIWORD(lParam)-150, TRUE ) ; MoveWindow ( hwndButton1, LOWORD(lParam)-180, 50, 130, 30, TRUE ) ; MoveWindow ( hwndButton2, LOWORD(lParam)-180, 100, 130, 30, TRUE ) ; MoveWindow ( hwndButton3, LOWORD(lParam)-180, 140, 130, 30, TRUE ) ; MoveWindow ( hwndStatus, NULL, NULL, NULL, NULL, NULL ) ; SendMessage ( hwndStatus, SB_SETPARTS, 2, (LPARAM) lokerot ) ; return 0; case WM_COMMAND : // lapsi-ikkunoiden sanomien käsittely switch (HIWORD(wParam)) { case LBN_DBLCLK: // listboxia tuplanaputettiin SendMessage ( hwnd, WM_COMMAND, MAKEWPARAM(5, BN_CLICKED), NULL ) ; SendMessage ( hwndStatus, SB_SETTEXT, 0, (LPARAM) "Poistit rivin tuplanapautuksella..." ) ; return 0; case BN_CLICKED: // nappia on painettu if ( LOWORD (wParam) == 3 ) { GetWindowText ( hwndEdit, buffer, 99 ) ; if ( strcmp( buffer , "" ) == TRUE ) { SendMessage ( hwndList1, LB_ADDSTRING, 0, (LPARAM) buffer ) ; SendMessage ( hwndStatus, SB_SETTEXT, 0, (LPARAM) "Lisäsit juuri rivin..." ) ; rivit += 1 ; itoa(rivit, buffer, 10); SendMessage ( hwndStatus, SB_SETTEXT, 1, (LPARAM) buffer ) ; } else SendMessage ( hwndStatus, SB_SETTEXT, 0, (LPARAM) "Rivin lisäys ei onnistunut..." ) ; } if ( LOWORD (wParam) == 5 ) { int index = SendMessage ( hwndList1, LB_GETCURSEL, 0, 0 ) ; // kysytään valittu rivi listboxista if ( index != LB_ERR ) { SendMessage ( hwndList1, LB_DELETESTRING, index, 0) ; SendMessage ( hwndStatus, SB_SETTEXT, 0, (LPARAM) "Poistit rivin painamalla nappia..." ) ; rivit -= 1 ; itoa(rivit, buffer, 10) ; // tietotyypin muunnos SendMessage ( hwndStatus, SB_SETTEXT, 1, (LPARAM) buffer ) ; } else SendMessage ( hwndStatus, SB_SETTEXT, 0, (LPARAM) "Rivin poisto ei onnistunut..." ) ; } if ( LOWORD (wParam) == 6 ) { SendMessage ( hwndList1, LB_RESETCONTENT, 0, 0 ) ; // tyhjennetään listbox SendMessage ( hwndStatus, SB_SETTEXT, 0, (LPARAM) "Tyhjensit juuri listan..." ) ; rivit = 0 ; itoa(rivit, buffer, 10) ; // tietotyypin muunnos SendMessage ( hwndStatus, SB_SETTEXT, 1, (LPARAM) buffer ) ; } } return 0 ; // pois ikkunaproseduurista 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
