/**************/ /* sampletm.c */ /***************************************************************************** PROGRAM: sampletm.c PURPOSE: Runko yksinkertaisille Windows-ohjelmille joista myös halutaan tulostaa (t) ja mahdollistaa moniajo (m). 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 sampletm.c tulostus.c checker.c myown.c tulostus.def tulostus.rc ja käännetään! Siinä se! Alla olevaan koodiin on kommentoitu t jos rivi on lisätty tulostuksen takia ja m jos lisätty moniajon takia. 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; ----------------------------------------------------------------------------- Tulostuksen takia on lisätty aliohjelmat: StartPrinting StopPrinting PrinterSetup Pelkän tulostamisen lisäämiseksi ei tarvitse lisätä välttämättä muuta kuin if ( ( hDCPrinter = StartPrinting(hWnd) ) != NULL ) { MyDraw(hWnd,hDCPrinter); StopPrinting(hDCPrinter); } Eli tulostuksen takia ei moniajorivejä tarvita, eikä kääntäen, mutta jollei moniajorivejä ole, tulee hankaluuksia joskus, kun ohjelma sammutetaan kesken tulostuksen (resursseja saattaa jäädä vapauttamatta). Jos halutaan moniajo, pitää tulostuksen takia moniajon tarkistuksessa valvoa myös GP.Printing -lippua, jottei rekursiivisesti kutsuta piirto-ohjelmaa! Tästä seuraa se, että myös WM_PAINT -viesti pitää muuttaa viivästytesti suoritettavaksi. Jos ohjelma yritetään sulkea kesken tulostuksen, jää sulkeminen odottamaan kunnes tulostus on valmis TAI painetaan tulostuksen CANCEL-nappulaa! Viivästytetystä sulkemisesta tulee viesti käyttäjälle ikkunan otsikkoon. Editor: Vesa Lappalainen 10.9.1992 ja tulostus 30.10.1992 *****************************************************************************/ #include /* Tarvitaan kaikissa Windows C-ohjelmissa */ #include "tulostus.h" #include "tulmenu.h" #include "samplewm.h" #include "checker.h" #define MAINWNAME "TulostusWMClass"/* Tunniste, jolla ikkunaluokka tunnetaan*/ #define CALLBACK_E CALLBACK _export /****************************************************************************/ LONG CALLBACK_E MainWndProcS(HWND hWnd, unsigned message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hDCPrinter; switch ( IsCheckingMessage(hWnd,message,wParam,lParam) ) { /* m */ case 1: return NULL; /* m */ case -1: return DefWindowProc(hWnd, message, wParam, lParam); /* m */ } /* m */ switch (message) { case WM_PAINT: /* Viesti: Piirrä ikkuna uudelleen */ if ( BeginPaint(hWnd,&ps) ) { MyDraw(hWnd,ps.hdc); CheckEndPaint(hWnd,&ps); } /* m */ return NULL; case WM_DESTROY: /* Viesti: ikkuna hävitetään */ PostQuitMessage(0); 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_COMMAND: /* Tulostusmenusta tulevat komennot: */ switch ( wParam ) { case IDM_FILE_PRINT: /* t */ if ( ( hDCPrinter = StartPrinting(hWnd,PSC_DISPLAY) ) != NULL ) { /* TextOut(hDCPrinter,20,50,"Hello World!",12); /* t */ MyDraw(hWnd,hDCPrinter); /* t */ StopPrinting(hWnd,hDCPrinter); /* t */ } /* t */ return NULL; /* t */ case IDM_FILE_PRINTER_SETUP: /* t */ SetupPrinter(1); /* t */ return NULL; /* t */ /* t */ case IDM_FILE_EXIT: SendMessage(hWnd,WM_DESTROY,0,0); return NULL; default: break; } break; 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 */ InformPrinter(hInstance); /* Tulostuksen takia! */ /* t */ 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 = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = "PRINTMENU"; 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); /* m */ } return (msg.wParam); /* Palautetaan PostQuitMessage-funktion arvo */ }