Win32 tehtäviä perusteet vastaus1

Mureakuha

Loikkaa: valikkoon, hakuun

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ä.


Alkuperäinen (c) Petteri Hämäläinen

Henkilökohtaiset työkalut