#include 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 }