Win32 tehtäviä syventävät vastaus4

Mureakuha

Loikkaa: valikkoon, hakuun

Tehtävä:

Kirjoita ohjelma, joka osaa muuntaa valuuttoja kuvan esittämällä tavalla. '-->'-nappi siirtää Valuutta 1:n edit-kontrolliin kirjoitetun valuuttamäärän Valuutta 2:n edit-kontrolliin valittuun valuuttamuotoon ja päinvastoin. Jos muunnos ei ole mahdollinen palautetaan pelkästään 0.

#include <windows.h>
 
HINSTANCE hInstance ; // käynnistyvän ohjelman kahva
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
 
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
  static char szAppName[] = "Oma ohjelma" ; // 'ohjelman nimi'
  HWND hwnd ;
  MSG msg ;
  WNDCLASSEX wndclass ;
 
  wndclass.cbSize = sizeof (wndclass) ;
  wndclass.style = CS_HREDRAW | CS_VREDRAW ;
  wndclass.lpfnWndProc = WndProc ;
  wndclass.cbClsExtra = 0 ;
  wndclass.cbWndExtra = 0 ;
  wndclass.hInstance = hInstance ;
  wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
  wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
  wndclass.hbrBackground = (HBRUSH) COLOR_WINDOW ;
  wndclass.lpszMenuName = NULL ;
  wndclass.lpszClassName = szAppName ;
  wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION) ;
 
  RegisterClassEx (&wndclass) ;
 
  hwnd = CreateWindow (szAppName, "Valuuttakonvertteri",
  WS_OVERLAPPEDWINDOW,
  CW_USEDEFAULT, CW_USEDEFAULT,
  500, 300,
  NULL, NULL, hInstance, NULL) ;
 
  ShowWindow (hwnd, iCmdShow) ;
  UpdateWindow (hwnd) ; // ikkunan päivitys
 
  while (GetMessage (&msg, NULL, 0, 0))
  {
    TranslateMessage (&msg) ;
    DispatchMessage (&msg) ;
  }
 
  return msg.wParam ;
}
 
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
  static double Kurssit[3][3] = {{1, 0.18, 0.16}, {5.5, 1, 0.89}, {6.2, 1.13, 1}} ; //Kurssitaulukossa on valuuttakurssit
  static HWND hwndGroupboxValuutta1, hwndGroupboxValuutta2, hwndButton1, hwndButton2,
  hwndEdit1, hwndEdit2, hwndRadio1V1, hwndRadio2V1, hwndRadio3V1, hwndRadio1V2,
  hwndRadio2V2, hwndRadio3V2 ; // kontrollien kahvat
  static HFONT hFont ; // käytetyn fontin kahva
 
  switch (iMsg) // sanomien käsittelyrakenne
  {
 
  case WM_CREATE : // initialisaatiosanoman käsittely
    hFont = (HFONT) GetStockObject(DEFAULT_GUI_FONT) ; // järjestelmän käyttämä fontti
 
    hwndGroupboxValuutta1 = CreateWindowEx(NULL, "button", "Valuutta 1", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 0, 0, 0, 0, hwnd, (HMENU) 0, hInstance, NULL) ; // kehys
    SendMessage (hwndGroupboxValuutta1, WM_SETFONT, (WPARAM) hFont, MAKELPARAM(TRUE, 0)) ; // vaihdetaan groupboxin fontti
    hwndGroupboxValuutta2 = CreateWindowEx(NULL, "button", "Valuutta 2", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 0, 0, 0, 0, hwnd, (HMENU) 1, hInstance, NULL) ; // kehys
    SendMessage (hwndGroupboxValuutta2, WM_SETFONT, (WPARAM) hFont, MAKELPARAM(TRUE, 0)) ; // vaihdetaan groupboxin fontti
 
    hwndButton1 = CreateWindowEx(NULL, "button", "-->", WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hwnd, (HMENU) 2, hInstance, NULL) ; // painonappi
    SendMessage (hwndButton1, WM_SETFONT, (WPARAM) hFont, MAKELPARAM(TRUE, 0)) ; // vaihdetaan fontti
    hwndButton2 = CreateWindowEx(NULL, "button", "<--", WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hwnd, (HMENU) 3, hInstance, NULL) ; // painonappi
    SendMessage (hwndButton2, WM_SETFONT, (WPARAM) hFont, MAKELPARAM(TRUE, 0)) ; // vaihdetaan fontti
 
    hwndEdit1 = CreateWindowEx (WS_EX_CLIENTEDGE, "edit", "100", WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL, 0, 0, 0, 0, hwnd, (HMENU) 4, hInstance, NULL) ; 
    SendMessage (hwndEdit1, WM_SETFONT, (WPARAM) hFont, MAKELPARAM(TRUE, 0)) ; // vaihdetaan fontti
    hwndRadio1V1 = CreateWindowEx(NULL, "button", "Markka", WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP, 0, 0, 0, 0, hwnd, (HMENU) 5, hInstance, NULL) ; // WS_GROUP = Autoradiobuttonryhmä alkaa
    SendMessage (hwndRadio1V1, WM_SETFONT, (WPARAM) hFont, MAKELPARAM(TRUE, 0)) ; // vaihdetaan fontti
    SendMessage (hwndRadio1V1, BM_SETCHECK, 1, 0) ; // 'Markka' päälle
    hwndRadio2V1 = CreateWindowEx(NULL, "button", "Dollari", WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 0, 0, 0, 0, hwnd, (HMENU) 6, hInstance, NULL) ; // Vasen Dollari autoradio
    SendMessage (hwndRadio2V1, WM_SETFONT, (WPARAM) hFont, MAKELPARAM(TRUE, 0)) ; // vaihdetaan fontti
    hwndRadio3V1 = CreateWindowEx(NULL, "button", "Ecu", WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 0, 0, 0, 0, hwnd, (HMENU) 7, hInstance, NULL) ; // Vasen Ecu autoradio
    SendMessage (hwndRadio3V1, WM_SETFONT, (WPARAM) hFont, MAKELPARAM(TRUE, 0)) ; // vaihdetaan fontti
 
    hwndEdit2 = CreateWindowEx (WS_EX_CLIENTEDGE, "edit", "100", WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL, 0, 0, 0, 0, hwnd, (HMENU) 8, hInstance, NULL) ; 
    SendMessage (hwndEdit2, WM_SETFONT, (WPARAM) hFont, MAKELPARAM(TRUE, 0)) ; // vaihdetaan fontti
    hwndRadio1V2 = CreateWindowEx(NULL, "button", "Markka", WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP, 0, 0, 0, 0, hwnd, (HMENU) 9, hInstance, NULL) ; // WS_GROUP = Autoradiobuttonryhmä alkaa
    SendMessage (hwndRadio1V2, BM_SETCHECK, 1, 0) ; // 'Markka' päälle
    SendMessage (hwndRadio1V2, WM_SETFONT, (WPARAM) hFont, MAKELPARAM(TRUE, 0)) ; // vaihdetaan fontti
    hwndRadio2V2 = CreateWindowEx(NULL, "button", "Dollari", WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 0, 0, 0, 0, hwnd, (HMENU) 10, hInstance, NULL) ; // Oikea Dollari autoradio
    SendMessage (hwndRadio2V2, WM_SETFONT, (WPARAM) hFont, MAKELPARAM(TRUE, 0)) ; // vaihdetaan fontti
    hwndRadio3V2 = CreateWindowEx(NULL, "button", "Ecu", WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 0, 0, 0, 0, hwnd, (HMENU) 11, hInstance, NULL) ; // Oikea Ecu autoradio
    SendMessage (hwndRadio3V2, WM_SETFONT, (WPARAM) hFont, MAKELPARAM(TRUE, 0)) ; // vaihdetaan fontti
 
    return 0 ; // pois ikkunaproseduurista
 
  case WM_COMMAND : // kontrollien lähettämien sanomien käsittely
    if (HIWORD (wParam) == BN_CLICKED) // napinpainallus aiheuttaa BN_CLICKED-tapahtuman
    {
      long Valuutta1, Valuutta2 ; // 0=Markka, 1=Dollari, 2=Ecu
      char bufferi[10] ;  
 
      if (SendMessage (hwndRadio1V1, BM_GETCHECK, 0, 0) != 0) Valuutta1 = 0 ; // Onko Autoradio1V1 päällä?
      else if (SendMessage (hwndRadio2V1, BM_GETCHECK, 0, 0) != 0) Valuutta1 = 1 ; // Onko Autoradio2V1 päällä?
      else if (SendMessage (hwndRadio3V1, BM_GETCHECK, 0, 0) != 0) Valuutta1 = 2 ; // Onko Autoradio3V1 päällä?
        
      if (SendMessage (hwndRadio1V2, BM_GETCHECK, 0, 0) != 0) Valuutta2 = 0 ; // Onko Autoradio1V2 päällä?
      else if (SendMessage (hwndRadio2V2, BM_GETCHECK, 0, 0) != 0) Valuutta2 = 1 ; // Onko Autoradio2V2 päällä?
      else if (SendMessage (hwndRadio3V2, BM_GETCHECK, 0, 0) != 0) Valuutta2 = 2 ; // Onko Autoradio3V2 päällä?
 
      if (LOWORD(wParam)==2) //LOWORD makro purkaa bitit 1-16 wParam:sta
      {
        GetWindowText ( hwndEdit1, bufferi, 10 ) ; // Luetaan Edit1 teksti
        long luku = atol(bufferi) ; // Muunnetaan se numeroksi
        if (luku <= 0 ) MessageBox (hwnd, "Syötetty arvo ei ole muunnettavissa!", "Virhe", MB_OK | MB_SYSTEMMODAL  ) ; // Jos muunnos ei onnistunut
 
        luku = long(luku * Kurssit[Valuutta1][Valuutta2]) ; // Kerrotaan oikealla kurssilla, long(...) on jotta ei saada varoitusta
 
        ltoa(luku, bufferi, 10) ; // Muunnetaan numero tekstiksi
        SetWindowText (hwndEdit2, bufferi) ; // Kirjoitetaan teksit Edit2:n
      }
      else if (LOWORD(wParam)==3) //LOWORD makro purkaa bitit 1-16 wParam:sta
      {
        GetWindowText ( hwndEdit2, bufferi, 10 ) ;
        long luku = atol(bufferi) ;
        if (luku <= 0 ) MessageBox (hwnd, "Syötetty arvo ei ole muunnettavissa!", "Virhe", MB_OK) ;
 
        luku = long(luku * Kurssit[Valuutta2][Valuutta1]) ; //long(...) on jotta ei saada varoitusta
 
        ltoa(luku, bufferi, 10) ;
        SetWindowText (hwndEdit1, bufferi) ;
      }
    }
    return 0 ; // pois ikkunaproseduurista
 
  case WM_SIZE : // käyttäjä on muuttamassa lomakkeen kokoa, muutetaan kontrollien paikkoja
    MoveWindow (hwndGroupboxValuutta1, 10,                    10,                            LOWORD(lParam)/2 - 40, HIWORD(lParam) - 20, TRUE) ; // siirretään kontrolli oikeaan paikkaan
    MoveWindow (hwndGroupboxValuutta2, LOWORD(lParam)/2 + 31, 10,                            LOWORD(lParam)/2 - 40, HIWORD(lParam) - 20, TRUE) ; // int(...) on, jotta ei saada varoitusta
    MoveWindow (hwndButton1,           LOWORD(lParam)/2 - 20, int(HIWORD(lParam) * 0.50-40), 40, 40, TRUE) ; 
    MoveWindow (hwndButton2,           LOWORD(lParam)/2 - 20, int(HIWORD(lParam) * 0.50),    40, 40, TRUE) ; 
    MoveWindow (hwndEdit1,             20,                    int(HIWORD(lParam) * 0.17),    LOWORD(lParam)/2 - 60, 19, TRUE) ; 
    MoveWindow (hwndRadio1V1,          30,                    int(HIWORD(lParam) * 0.35),    LOWORD(lParam)/2 - 80, 12, TRUE) ; 
    MoveWindow (hwndRadio2V1,          30,                    int(HIWORD(lParam) * 0.55),    LOWORD(lParam)/2 - 80, 12, TRUE) ; 
    MoveWindow (hwndRadio3V1,          30,                    int(HIWORD(lParam) * 0.75),    LOWORD(lParam)/2 - 80, 12, TRUE) ; 
    MoveWindow (hwndEdit2,             LOWORD(lParam)/2 + 43, int(HIWORD(lParam) * 0.17),    LOWORD(lParam)/2 - 60, 19, TRUE) ; 
    MoveWindow (hwndRadio1V2,          LOWORD(lParam)/2 + 53, int(HIWORD(lParam) * 0.35),    LOWORD(lParam)/2 - 80, 12, TRUE) ; 
    MoveWindow (hwndRadio2V2,          LOWORD(lParam)/2 + 53, int(HIWORD(lParam) * 0.55),    LOWORD(lParam)/2 - 80, 12, TRUE) ; 
    MoveWindow (hwndRadio3V2,          LOWORD(lParam)/2 + 53, int(HIWORD(lParam) * 0.75),    LOWORD(lParam)/2 - 80, 12, TRUE) ; 
    return 0 ; // pois ikkunaproseduurista
 
  case WM_GETMINMAXINFO :
  {
    MINMAXINFO *rajat = (LPMINMAXINFO) lParam;
    rajat->ptMinTrackSize.x = 300; // minimileveys
    rajat->ptMinTrackSize.y = 200; // minimikorkeus
    rajat->ptMaxTrackSize.x = 500; // maksimileveys
    rajat->ptMaxTrackSize.y = 300; // maksimikorkeus
    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