Win32 tehtäviä vaikeat vastaus2
Mureakuha
Tehtävänanto oli:
Kirjoita ohjelma, jossa on tilarivi yleinen kontrolli ja kehyskontrolli. Tilarivi on jaettu kolmeen osaan. Ensimmäiseen osaan tulostetaan ohjeteksti joka ei muutu ohjelman ajon aikana, toiseen ja kolmanteen osaan tulostetaan tiedot ikkunan koosta. Nämä tiedot täytyy päivittää kun ikkunan kokoa muutetaan. Samaten kehyksen koon täytyy seurata lomakkeen kokoa.
#include <windows.h> #include <commctrl.h> // yleisten kontrollien otsikkotiedosto 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[] = "Tilarivi" ; // '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 "Tilarivi", // 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 InitCommonControls(); // tilarivi on commoncontrol ja vaatii alustuksen tällä funktiolla 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 hwndStatus, hwndGroupbox ; // kahvat static long osat[3] ; // taulukko jossa on tilarivin osien oikeat reunat static char bufferi[20] ; // tilapäinen merkkijonomuuttuja switch (iMsg) // sanomien käsittelyrakenne { case WM_CREATE: // initialisaatiosanoma hwndGroupbox=CreateWindow("button", NULL, WS_CHILD|WS_VISIBLE|BS_GROUPBOX, 0, 0, 0, 0, hwnd, (HMENU) 0, hInstance, NULL); // koristelaatikko, koko asetetaan WM_SIZE sanomassa hwndStatus=CreateWindow(STATUSCLASSNAME, "Seurataan ikkunan koon muutosta", WS_CHILD|WS_VISIBLE|CCS_BOTTOM|SBARS_SIZEGRIP, 0, 0, 0, 0, hwnd, (HMENU) 2, hInstance, NULL); // tilarivi, koko asetetaan WM_SIZE sanomassa return 0 ; case WM_SIZE : // LOWORD(lParam)=lomakkeen leveys ja HIWORD(lParam)=lomakkeen korkeus { MoveWindow (hwndStatus, NULL, NULL, NULL, NULL, NULL) ; // muutetaan tilarivin kokoa MoveWindow (hwndGroupbox, 10, 10, LOWORD(lParam)-20, HIWORD(lParam)-40, TRUE) ; // muutetaan koristelaatikkon kokoa int osat[3] = { LOWORD(lParam) - 200, LOWORD(lParam) - 100, LOWORD(lParam) } ; // muutetaan tilarivien osien kokoja SendMessage (hwndStatus, SB_SETPARTS, (WPARAM) 3,(LPARAM) osat); // SB_SETPARTS = asetaan ne voimaan wsprintf (bufferi, "%3d", LOWORD(lParam)) ; // kopioidaan ikkunan leveys bufferiin ja muutetaan sen tietotyyppi chariksi strcat (bufferi, " leveys") ; // liitetään teksti "leveys" numeron perään SendMessage (hwndStatus, SB_SETTEXT, 1, (LPARAM) bufferi) ; // tulostetaan teksti toiseen osaan tilarivillä wsprintf (bufferi, "%3d", HIWORD(lParam)) ; // kopioidaan ikkunan korkeus bufferiin ja muutetaan sen tietotyyppi chariksi strcat (bufferi, " korkeus") ; // liitetään teksti "korkeus" numeron perään SendMessage (hwndStatus, SB_SETTEXT, 2, (LPARAM) bufferi) ; // tulostetaan teksti kolmanteen osaan tilarivillä 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
