/***************************************************************************** PROGRAM: Mhello.c PURPOSE: "Pienin Windows-ohjelma". Tulostaa näyttöön tekstin Hello World Editor: Vesa Lappalainen typistänyt malliohjelmista. Project: mhello.c, mhello.def Muutettu: lopetuskysely, useita ikkunoita ohjelmaan. MN / 5.6.2004 *****************************************************************************/ #include /* Tarvitaan kaikissa Windows C-ohjelmissa */ LONG CALLBACK _export MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; switch (message) { case WM_PAINT: /* Viesti: Piirrä ikkuna uudelleen */ if ( BeginPaint(hWnd,&ps) ) TextOut(ps.hdc, 10, 10, "Hello World!",12); EndPaint(hWnd,&ps); return 0; case WM_CLOSE: // viesti: käyttäjä haluaa sulkea ikkunan if (MessageBox(hWnd,"Lopetetaanko?","WHello",MB_YESNO)==IDYES) DestroyWindow(hWnd); return 0; case WM_DESTROY: /* Viesti: ikkuna hävitetään */ PostQuitMessage(0); return 0; default: /* Antaa Windowsin käsitellä muut */ break; } return DefWindowProc(hWnd, message, wParam, lParam); } LONG CALLBACK _export AnotherWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; switch (message) { case WM_PAINT: /* Viesti: Piirrä ikkuna uudelleen */ if ( BeginPaint(hWnd,&ps) ) TextOut(ps.hdc, 10, 10, "Toinen ikkuna...",12); EndPaint(hWnd,&ps); return 0; default: /* Antaa Windowsin käsitellä muut */ break; } return DefWindowProc(hWnd, message, wParam, lParam); } int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASS wc; /* Ikkunaluokka */ HWND hWnd,h2,h3,hButton; /* Pääikkunan kahva */ MSG msg; /* Viesti */ (void)lpCmdLine; /* Hämäystä, jottei valitusta param. käytt. */ // if-lause ei ole tarpeen WIN32-sovelluksissa // (win95 ja myöhemmissä hPrevInstance on aina NULL), // koska jokaista sovellusta ajetaan omassa koodisegmentissään. // if-lause säilytetty yhteensopivuuden vuoksi. MN / 3.6.2004 if (!hPrevInstance) { // Onko muita esiintymiä käynnisssä? wc.style = 0 ; wc.lpfnWndProc = MainWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = "WHelloWClass"; if (!RegisterClass(&wc)) return 1; } hWnd = CreateWindow("WHelloWClass","Windows Hello",WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, NULL,NULL,hInstance,NULL); wc.lpszClassName = "AnotherWindow"; wc.lpfnWndProc = AnotherWndProc; if (!RegisterClass(&wc)) return 1; h2 = CreateWindow("AnotherWindow","Another Window",WS_DLGFRAME | WS_SYSMENU, CW_USEDEFAULT,CW_USEDEFAULT,100,100, NULL,NULL,hInstance,NULL); h3 = CreateWindow("AnotherWindow","3rd Window",WS_DLGFRAME | WS_SYSMENU, CW_USEDEFAULT,CW_USEDEFAULT,100,100, NULL,NULL,hInstance,NULL); // win-kontrollit _ovat_ ikkunoita! // Standardit ikkunaluokat Win32 SDK, CreateWindow-funktion avustus hButton = CreateWindow("Button","Hello Button",WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,200,150, NULL,NULL,hInstance,NULL); if ( !hWnd ) return 1; ShowWindow(hWnd, nCmdShow); /* Näytetään ikkuna */ UpdateWindow(hWnd); /* Lähetetään WM_PAINT viesti */ ShowWindow(h2,SW_SHOW); ShowWindow(h3,SW_SHOW); ShowWindow(hButton,SW_SHOW); // CloseWindow(hWnd); // minimoi ikkunan, mutta ei tuhoa sitä // SendMessage(hWnd,WM_CLOSE,NULL,NULL); // ikkunan sulkeminen viestillä (vastaa close-painikkeen painallusta) // DestroyWindow(hWnd); // tuhoaa ikkunan. windows kutsuu tätä oletuksena automaattisesti while (GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); /* Tulkitaan virtuaaliset näp. koodit */ DispatchMessage(&msg); /* Lähetetään viesti ikkunalle */ } return msg.wParam; /* Palautetaan PostQuitMessage-funktion arvo */ }