Win32 tehtäviä syventävät vastaus1

Mureakuha

Loikkaa: valikkoon, hakuun

Tehtävä:

Kirjoita ohjelma, jossa käyttäjä voi valita lottonumerot. Ohjelmassa on luetteloruutu, kymmenen staattista tekstiruutua numeroille ja kaksi kuvassa olevalle tekstille ja nappi. Luetteloruudusta voi tuplanaputtamalla valita oikeat numerot ja ne tulevat oikeassa järjestyksessä, alusta alkaen omiin lokeroihinsa. 'Reset'-nappi käynnistää ohjelman uudestaan. Se siis kirjoittaa luetteloruudun numerot uudelleen ja tyhjentää numerolaatikot.

#include <windows.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[] = "Lottonumerot" ; // '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
  "Lottonumerot", // 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 hwndList, hwndStatic[10], hwndButton; // kahvat
  char bufferi[10] ; // tilapäinen merkkijonomuuttuja
  static int i = 0 ; // laskuri
 
  switch (iMsg) // sanomien käsittelyrakenne
  {
    case WM_CREATE: // initialisaatiosanoma
      {
      CreateWindow("button", NULL, WS_CHILD|WS_VISIBLE|BS_GROUPBOX,
       10, 10, 473, 255, hwnd, (HMENU) 0, hInstance, NULL); // koristelaatikko lomakkeella
 
      hwndList=CreateWindowEx(WS_EX_CLIENTEDGE,"listbox", NULL, WS_CHILD|WS_VISIBLE|LBS_MULTICOLUMN|LBS_NOTIFY,
       40, 50, 413, 130, hwnd, (HMENU) 1, hInstance, NULL); // luetteloruutu
      SendMessage ( hwndList, LB_SETCOLUMNWIDTH, 68, 0 ) ; // asetetaan kolumnit luetteloruutuun
      for (i=1 ; i <= 39 ; i ++) // lasketaan lottonumerot luetteloruutuun
      {
        char merkki[2] ;
        itoa ( i, merkki, 10 ) ; // tietotyypin muutos
        SendMessage ( hwndList, LB_ADDSTRING, 0, (LPARAM) merkki ) ; // lisätään rivi
      }
 
      CreateWindow("static", "Numerot:", WS_CHILD|WS_VISIBLE,
       40, 191, 70, 22, hwnd, (HMENU) 0, hInstance, NULL); // staattinen tekstilaatikko
 
      CreateWindow("static", "Lisänumerot:", WS_CHILD|WS_VISIBLE,
       40, 223, 110, 22, hwnd, (HMENU) 0, hInstance, NULL); // staattinen tekstilaatikko
 
      for (i=0 ; i <= 6 ; i ++)
        hwndStatic[i]=CreateWindowEx(WS_EX_CLIENTEDGE, "static", NULL, WS_CHILD|WS_VISIBLE|SS_CENTER,
         130+40*i, 191, 30, 22, hwnd, (HMENU) 0, hInstance, NULL); // staattinen tekstinlaatikko
 
      for (i=7 ; i <= 9 ; i ++)
        hwndStatic[i]=CreateWindowEx(WS_EX_CLIENTEDGE, "static", NULL, WS_CHILD|WS_VISIBLE|SS_CENTER,
         130+40*(i-7), 223, 30, 22, hwnd, (HMENU) 0, hInstance, NULL); // staattinen tekstinlaatikko
 
      hwndButton=CreateWindow("button", "Reset", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
       360, 220, 100, 28, hwnd, (HMENU) 99, hInstance, NULL); // painonappi
 
      i = 0 ; // nollataan laskuri
      return 0 ;
      }
 
 
    case WM_COMMAND :
 
       switch HIWORD(wParam)  // tässä palautuu tapahtumatunnus
      {
        case LBN_DBLCLK: // tapahtumatunnus LBN_DBLCLK = listaa on tuplanautettu
          SendMessage (hwndList, LB_GETTEXT, SendMessage (hwndList, LB_GETCURSEL, 0, 0), (LPARAM) bufferi); // haetaan valittu teksti
          SetWindowText (hwndStatic[i], bufferi) ; // kirjoitetaan teksti
          SendMessage (hwndList, LB_DELETESTRING, SendMessage (hwndList, LB_GETCURSEL, 0, 0), 0) ; // poistetaan rivi
          i++ ; // lisätään laskuria
          if (i == 10) EnableWindow (hwndList, FALSE) ; // kun kaikki numerot on valittu, poistetaan lista käytöstä
          return 0 ;
 
        case BN_CLICKED: // reset-nappia on painettu
          for (i=0 ; i <= 9 ; i ++) // kirjoitetaan tyhjää
            SetWindowText (hwndStatic[i], NULL) ;
          EnableWindow (hwndList, TRUE); // avataan luetteloruutu...
          SendMessage (hwndList, LB_RESETCONTENT, 0, 0) ; // ...tyhjennetään se...
 
          for (i=1 ; i <= 39 ; i ++) // ...ja täytetään uudestaan
          {
            char merkki[2] ;
            itoa ( i, merkki, 10 ) ;
            SendMessage ( hwndList, LB_ADDSTRING, 0, (LPARAM) merkki ) ;
          }
 
          i=0 ;
          return 0 ;
 
      }
      return 0 ;
 
 
    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