ReleaseDC (hwnd, hdcScr) ;Delete0bject (hBitmap) ;LockWindowUpdate (NULL) : 1,return FALSE ;Rysunek 14-20...

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 // z powodu definicji funkcji abs
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 ;
Powered by wordpress | Theme: simpletex | © Jak cię złapią, to znaczy, że oszukiwałeś. Jak nie, to znaczy, że posłużyłeś się odpowiednią taktyką.