Win32 tehtäviä syventävät vastaus4
Mureakuha
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ä.
Kopio lisenssistä (englanniksi) löytyy täältä.
Alkuperäinen (c) Petteri Hämäläinen
