Win32 tehtäviä vaikeat vastaus2

Mureakuha

Loikkaa: valikkoon, hakuun

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

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

Henkilökohtaiset työkalut