Jak cię złapią, to znaczy, że oszukiwałeś. Jak nie, to znaczy, że posłużyłeś się odpowiednią taktyką.
Program SCRAMBLE
Cz II Grafika Program SCRAMBLE nie ma procedury okna. Najpierw w procedurze WinMain wywouje LockWindowUpdate z uchwytem okna pulpitu. Funkcja ta zapobiega uaktualnieniu ekranu przez jakikolwiek inny program. Nastpnie SCIZAMBLE uzyskuje kontekst urzdzenia caego ekranu, wywoujc GetDCEx z argumentem DCX LOCKWINDOWUPDATE. To pozwala programowi SCRAMBLE pisa po ekranie w sytuacji, gdy aden inny program nie moe tego robi. Nastpnie SCIZAMBLE okrela wymiary caego ekranu i dzieli je przez 10. Pro- gram uywa tych wymiarw (o nazwach cx i cy) do utworzenia bitmapy, a na- stpnie wybiera t bitmap w kontekcie urzdzenia pamiciowego. Korzystajc z funkcji rand jzyka C, SCRAMBLE oblicza cztery wartoci losowe (wsprzdne dwch punktw), ktre s wielokrotnociami wartoci cx i cy. Dwa prostoktne bloki ekranu program zamienia miejscami, uywajc trzech funkcji BitBlt. Pierwsza kopiuje do kontekstu urzdzenia pamiciowego prostokt roz- poczynajcy si w pierwszym punkcie. Druga BitBlt kopiuje prostokt rozpoczy- najcy si w drugim punkcie w miejsce prostokta rozpoczynajcego si w pierw- szym. Trzeci kopiuje prostokt z kontekstu urzdzenia pamiciowego do obsza- ru rozpoczynajcego si w drugim punkcie. Proces ten zamienia miejscami za- warto dwch prostoktw na ekranie. SCRAMBLE wykonuje t operacj 300 razy, po czym ekran powinien by ju cakowicie wymieszany. Nie bj si jed- nak, SCRAMBLE ledzi cay ten baagan, a potem porzdkuje ekran, przywraca- jc jego normalny wygld (oraz odblokowuje go) przed zakoczeniem dziaania. Konteksty urzdze pamiciowych moesz take wykorzystywa do kopiowa- nia zawartoci jednej bitmapy na inn. Zamy, e chcesz utworzy bitmap zawierajc tylko lew grn wiartk innej bitmapy. Jeli oryginalna bitmapa miaa uchwyt hBitmap, moesz skopiowa jej wymiary do struktury typu BITMAP: GetObject (hBitmap, sizeof (BITMAP), &bm) ; i utworzy now, niezainicjowan bitmap wielkoci jednej czwartej rozmiaru pierwotnego: hBitmap2 = CreateBitmap (bm.bmWidth / 2, bm.bmHeight / 2, bm.bmPlanes, bm.bmBitsPixel, NULL) ; Teraz utwrz dwa konteksty urzdze pamiciowych i wybierz w nich oryginal- n oraz now bitmap: hdcMeml = CreateCompatibleDC (hdc) ; hdcMem2 = CreateCompatibleDC (hdc) : SelectObject (hdcMeml, hBitmap) ; SelectObject (hdcMem2, hBitmap2) ; Na koniec skopiuj lew grn wiartk pierwszej bitmapy do drugiej: BitBlt (hdcMem2, 0, 0, bm.bmWidth / 2, bm.bmHeight / 2, hdcMeml, 0, 0, SRCCOPY) ; No i skoczye. Trzeba jeszcze tylko posprzta po sobie: DeleteDC (hdcMeml) ; DeleteDC (hdcMem2) ; Delete0bject (hBitmap) ; Rozdzia 14: Bitmapy i BitBlty 645 , Program BLOWUP.C, zaprezentowany na rysunku 14-21, take wykorzystuje zablokowanie moliwoci uaktualniania okna, eby wywietli prostokt cigni- ty z ekranu spoza obszaru jego okna. Program ten pozwala przy uyciu myszy cign dowolny prostoktny obszar z ekranu. Nastpnie BLOWUP kopiuje za- warto tego prostoktnego obszaru do bitmapy. W czasie przetwarzania komu- nikatu WM PAINT bitmapa kopiowana jest do obszaru roboczego okna progra- mu i, jeli jest to konieczne, rozcigana lub zmniejszana (patrz rysunek 14-22). BLOWUP.C /* BLOWUP.C - Program ze szklem powikszajacym (c) Charles Petzold, 1998 */ include include include "resource.h" LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) static TCHAR szAppName [] = TEXT ("Blowup") : HACCEL hAccel ; HWND hwnd : MSG ms9 ; WNDCLASS 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, IDCARROW) : wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITEBRUSH) wndclass.lpszMenuName = szAppName ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) ( MessageBox (NULL, TEXT ("This program requires Windows NT!"), szAppName, MBICONERROR) ; return 0 ;
|
Wątki
|