Win32 tehtäviä perusteet vastaus1
Mureakuha
Tehtävänanto oli:
Kirjoita ohjelma, joka tulostaa (WM_PAINT sanomassa eli teksti itseasiassa piirretään) lomakkeelle vasempaan reunaan, keskelle pystysuunnassa ruudun ja ikkunan koot. Tietojen täytyy pysyä näkyvissä koko ajan vaikka lomakkeen paikka tai koko muuttuisikin.
#include <windows.h> // otsikkotiedoston lisäys #include <string.h> // otsikkotiedoston lisäys 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[] = "Ruudunkoko" ; // '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 "Ruudun koon tarkastelu", // 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 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) { HDC hdc ; // piirtopinnan kahva struktuuri PAINTSTRUCT ps ; // maalausstruktuuri RECT rect; // RECT-struktuuria käytetään GetClientRect() funktiossa static char bufferi[20]; switch (iMsg) // sanomien käsittelyrakenne { case WM_PAINT : // maalaussanoman käsittely hdc = BeginPaint (hwnd, &ps) ; // aloitetaan piirto SetBkMode(hdc, TRANSPARENT); // tekstin taustaväri läpinäkyväksi GetClientRect (hwnd, &rect); // kysytään ruudun koko ja talletetaan se rect muuttujaan wsprintf (bufferi, "%3d", GetSystemMetrics(SM_CXSCREEN)); // kopioidaan ruudun leveys bufferiin ja muutetaan sen tietotyyppi chariksi strcat (bufferi, " ruudun leveys"); // liitetään teksti "ruudun leveys" numeron perään TextOut (hdc, rect.left, rect.bottom/2-30, bufferi, 17); // tulostetaan teksti bufferista vasempaan reunaan ja 30 ylöspäin keskikohdasta wsprintf (bufferi, "%3d", GetSystemMetrics(SM_CYSCREEN)); // kopioidaan ruudun korkeus bufferiin ja muutetaan sen tietotyyppi chariksi strcat (bufferi, " ruudun korkeus"); // liitetään teksti "ruudun korkeus" numeron perään TextOut (hdc, rect.left, rect.bottom/2-10, bufferi, 18); // tulostetaan teksti bufferista vasempaan reunaan ja 10 ylöspäin keskikohdasta wsprintf (bufferi, "%3d", rect.right); // kopioidaan ikkunan leveys bufferiin ja muutetaan sen tietotyyppi chariksi strcat (bufferi, " ikkunan leveys"); // liitetään teksti "ikkunan leveys" numeron perään TextOut (hdc, rect.left, rect.bottom/2+10, bufferi, 18); // tulostetaan teksti bufferista vasempaan reunaan ja 10 alaspäin keskikohdasta wsprintf (bufferi, "%3d", rect.bottom); // kopioidaan ikkunan korkeus bufferiin ja muutetaan sen tietotyyppi chariksi strcat (bufferi, " ikkunan korkeus"); // liitetään teksti "ikkunan korkeus" numeron perään TextOut (hdc, rect.left, rect.bottom/2+30, bufferi, 19); // tulostetaan teksti bufferista vasempaan reunaan ja 30 alaspäin keskikohdasta EndPaint (hwnd, &ps) ; // lopetetaan piirto 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
