/**************/ /* samplewm.c */ /***************************************************************************** PROGRAM: samplewm.c PURPOSE: Runko yksinkertaisille Windows-ohjelmille. Kirjoitetaan tiedosto, jossa on funktiot MyMove (kun hiiri liikkunut) MyDown (kun hiiren näppäin alhaalla) MyUp (kun hiiren nappi päästetty ylös) ja MyDraw (vaikkapa tiedostoon myown.c) sekä merkkijono WindowName ja tehdään projekti, jossa on tiedostot samplewm.c myown.c (esimerkiksi) samplew.def checker.c määritellään NOT_PRINTER: [Alt-O] C C [Alt-D] NOT_PRINTER [Return] ja käännetään! Siinä se! Tähän versioon on lisätty viestijonon tarkistusaliohjelma, jonka avulla pitkät piirtosilmukat saadaan keskeytetyksi ja näin "moniajo" voi jatkua. Ohjelman kirjoittajan on lisättävä piirron pitkiin silmukoihin kutsu if ( CheckMessage() ) lopetetaan_piirto; Moniajon takia on lisätty kohdat jotka merkitty MONIAJO! Kääntämisessä täytyy määritellä NOT_PRINTER tai sitten lisätä vielä tulostus.c projektiin Editor: Vesa Lappalainen 10.9.1992 & 19.7.1993 *****************************************************************************/ #include /* Tarvitaan kaikissa Windows C-ohjelmissa */ #include "checker.h" /* MONIAJO! */ #include "samplewm.h" #define MAINWNAME "SampleWMClass" /* Tunniste, jolla ikkunaluokka tunnetaan */ /****************************************************************************/ LONG FAR PASCAL MainWndProcS(HWND hWnd, unsigned message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; switch ( IsCheckingMessage(hWnd,message,wParam,lParam) ) { /* MONIAJO! */ case 1: return NULL; case -1: return DefWindowProc(hWnd, message, wParam, lParam); } switch (message) { case WM_PAINT: /* Viesti: Piirrä ikkuna uudelleen */ if ( BeginPaint(hWnd,&ps) ) { MyDraw(hWnd,ps.hdc); CheckEndPaint(hWnd,&ps); /* MONIAJO! */ } return (NULL); case WM_LBUTTONDOWN: /* Hiiren vasen nappi alas: */ MyDown(hWnd,wParam,lParam); return (NULL); case WM_LBUTTONUP: /* Hiiren vasen nappi ylös: */ MyUp(hWnd,wParam,lParam); return (NULL); case WM_MOUSEMOVE : /* Hiirtä siirretty: */ MyMove(hWnd,wParam,lParam); return (NULL); case WM_DESTROY: /* Viesti: ikkuna hävitetään */ PostQuitMessage(0); return (NULL); default: /* Antaa Windowsin käsitellä muut */ break; } return (DefWindowProc(hWnd, message, wParam, lParam)); } /****************************************************************************/ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { #pragma argsused WNDCLASS wc; /* Ikkunaluokka */ HWND hWnd; /* Pääikkunan kahva */ MSG msg; /* Viesti */ if (!hPrevInstance) { /* Onko muita esiintymiä käynnisssä? */ wc.style = NULL; wc.lpfnWndProc = MainWndProcS; 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 = MAINWNAME; if (!RegisterClass(&wc)) return (FALSE); } hWnd = CreateWindow(MAINWNAME,WindowName,WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, NULL,NULL,hInstance,NULL); if (!hWnd) return (FALSE); ShowWindow(hWnd, nCmdShow); /* Näytetään ikkuna */ UpdateWindow(hWnd); /* Lähetetään WM_PAINT viesti */ while (GetMessage(&msg,NULL,NULL,NULL)) { TranslateMessage(&msg); /* Tulkitaan virtuaaliset näp. koodit */ DispatchMessage(&msg); /* Lähetetään viesti ikkunalle */ CheckDelayMessages(hWnd); /* MONIAJO! */ } return (msg.wParam); /* Palautetaan PostQuitMessage-funktion arvo */ }