Win32 tehtäviä perusteet vastaus4

Mureakuha

Loikkaa: valikkoon, hakuun

Tehtävänanto oli:

Kirjoita ohjelma, jossa on kaksi vierityspalkkia. Niiden asemaa pystyy hiirellä muuttamaan naputtelemalla kuilusta, palkin päistä tai siirtämällä hissilaatikkoa. Palkkien vieritysväli on 0 - 10000 ja kummankin palkin sen hetkinen tilanne tulostetaan static-ikkunaluokan kontrolliin riippuen siitä kumpaa palkkia käyttäjä viimeksi muutti.

#include <windows.h>
#include <stdlib.h>
 
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[] = "Vierityspalkki" ; // '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
  "Vierityspalkki", // ikkunan otsikko
  WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU, // 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) 
{
 
  static HWND hwndStatic, hwndVScroll, hwndHScroll ; // kahvat
  static int vpositio = 0, hpositio = 0; // palkkien tila
  static char bufferi[10] = {NULL} ; // tulostettava numero pitää muuttaa tekstiksi
 
  switch (iMsg) // sanomien käsittelyrakenne
  {
    case WM_CREATE : // initialisaatiosanoma
 
      CreateWindow ("button", NULL, 
      WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
      10,  10, 472, 255, hwnd, (HMENU) 1, hInstance, NULL) ; // kehys
 
      hwndVScroll = CreateWindow ("scrollbar", NULL,
      WS_CHILD | WS_VISIBLE | SBS_VERT,
      170, 60, 20, 140, hwnd, (HMENU) 2, hInstance, NULL) ; // pystysuuntainen vierityspalkki
      SetScrollRange (hwndVScroll, SB_CTL, 0, 10000, TRUE) ; // palkin vieritysalue
 
      hwndHScroll = CreateWindow ("scrollbar", NULL,
      WS_CHILD | WS_VISIBLE | SBS_HORZ,
      210, 120, 140, 20, hwnd, (HMENU) 3, hInstance, NULL) ; // vaakasuuntainen vierityspalkki
      SetScrollRange (hwndHScroll, SB_CTL, 0, 10000, TRUE) ; // palkin vieritysalue
 
      hwndStatic = CreateWindowEx (WS_EX_STATICEDGE,
      "static", "Static kontrolli", WS_CHILD | WS_VISIBLE | SS_CENTER,
      20, 235, 450, 20, hwnd, (HMENU) 4, hInstance, NULL) ;  // tekstinlaatikko
 
      return 0 ; // pois ikkunaproseduurista
 
 
    case WM_VSCROLL: // pystysuuntainen vierityspalkki
      switch (LOWORD(wParam))  // tässä palautuu tapahtumatunnus
      {
        case SB_PAGEDOWN : // palkin kuilua napautettiin
          vpositio = vpositio + 24; // muutetaan palkin asema uudelleen
        case SB_LINEDOWN : // palkin vieritysnappia napautettiin
          vpositio = min( 10000, vpositio + 1); // positio ei saa liukua ohi 10000
          break;
 
        case SB_PAGEUP : // palkin kuilua napautettiin
          vpositio = vpositio - 24; // muutetaan palkin asema uudelleen
        case SB_LINEUP : // palkin vieritysnappia napautettiin
          vpositio = max(0, vpositio - 1); // positio ei saa liukua ohi 0
          break;
 
        case SB_THUMBPOSITION : // palkkia siirretään hissistä
        case SB_THUMBTRACK : // palkkia siirretään hissistä
          vpositio = HIWORD(wParam) ; // HIWORD(wParam) = uusi asema
          break;
      }
      SetScrollPos (hwndVScroll, SB_CTL, vpositio, TRUE) ; // asetetaan palkin asemaksi paikka johon käyttäjä hissin siirsi
      SetWindowText (hwndStatic, itoa (vpositio, bufferi, 10)) ; // tulostetaan numero tekstiruutuun
      return 0;
 
    case WM_HSCROLL: // vaakasuuntainen vierityspalkki
      switch (LOWORD(wParam))  // tässä palautuu tapahtumatunnus
      {
        case SB_PAGEDOWN : // palkin kuilua napautettiin
          hpositio = hpositio + 24; // muutetaan palkin asemaa
        case SB_LINEDOWN : // palkin vieritysnappia napautettiin
          hpositio = min(10000, hpositio + 1);// positio ei saa liukua ohi 10000
          break;
 
        case SB_PAGEUP : // palkin kuilua napautettiin
          hpositio = hpositio - 24; // muutetaan palkin asemaa
        case SB_LINEUP : // palkin vieritysnappia napautettiin
          hpositio = max(0, hpositio - 1); // positio ei saa liukua ohi 0
          break;
 
        case SB_THUMBPOSITION : // palkkia siirretään hissistä
        case SB_THUMBTRACK : // palkkia siirretään hissistä
          hpositio = HIWORD(wParam) ; // HIWORD(wParam) = uusi asema
          break;
      }
      SetScrollPos ( hwndHScroll, SB_CTL, hpositio, TRUE ) ; // asettaa palkin asemaksi paikan johon käyttäjä hissin siirsi
      SetWindowText ( hwndStatic, itoa (hpositio, bufferi, 10) ) ; // tulostetaan numero tekstiruutuun
      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