[ Pobierz całość w formacie PDF ]
.Istnieje sposób rysowania na bitmapie w pamiêci, a nastêpnie przerzucenie jej na ekran jednym wywo³aniem szybkiej funkcji BitBit o.Prawie we wszystkich przypadkach powoduje to wyeliminowanie denerwuj¹cego migotania.Tworzenie migotaj¹cej aplikacjiTworz¹c tê aplikacjê, ujrzysz doskona³y przyk³ad migotania przy rysowaniu zawartoœci okna.Nieco póŸniej zmodyfikujemy ten program, korzystaj¹c z klasy CBitmap.Najlepiej bêdzie, jeœli stworzysz projekt samodzielnie od pocz¹tku, gdy¿ w ten sposób wiêcej siê nauczysz.Jeœli jednak nie chce Ci siê tego robiæ, pe³ny projekt znajdziesz na do³¹czonej do ksi¹¿ki p³ytce CD-ROM, w folderze RozdzlO\Flicker.1.Utwórz aplikacjê jednodokumentow¹.2.Ustaw timer tak by „tyka³" co sekundê.3.W funkcji obs³ugi timera wywo³aj funkcjeInwalidateRect ( NULL, TRUE ) oraz UpdateWindow () w celu odœwie¿enia zawartoœci okna widoku.4.Do funkcji OnDraw () dodaj poni¿szy kod:RECT Rect;GetClientRect(&Rect};static BOOL bColor = FALSE;if( bColor )pDC->SelectStockObject ( WHITE_PEN) elsepDC->SelectStockObject ( BLACK_PEN) bColor = IbColor;f or ( int i=0; KRect.right ; i + + ){ pDC->MoveTo ( i, O ); pDC->LineTo( i, Rect.bottom );5.Uruchom program i zmaksymalizuj go.Gdy program dzia³a, na ekranie co sekundê widaæ migotanie.Dzieje siê tak, poniewa¿ wystêpuje spory odstêp czasu pomiêdzy narysowaniem pierwszej i ostatniej linii.Poniewa¿ linie s¹ rysowane w kontrastowych kolorach (czarnym i bia³ym), migotanie jest szczególnie wyraŸne.Oto jak pozbyæ siê migotania w utworzonym przed chwil¹ programie.W funkcji OnDraw ( ) , przed rysowaniem linii, u¿yj funkcji CreateCompatibleDCO oraz CreateCompati-bleBitmapO w celu stworzenia kontekstu urz¹dzenia oraz bitmapy, na której bêdziesz rysowa³.Wykonaj wszystkie operacje rysunkowe.Na koniec za pomoc¹ funkcji BitBit ( ) przerzuæ bitmapê z pamiêci do obszaru roboczego okna.Nowa wersja funkcji OnDraw ( ) znajduje siê na listingu 10.8.Listing 10.8.Przeniesienie bitmapy z pamiêci do obszaru roboczego okna_____________RECT Rect; GetClientRect ( &Rect ) ;static BOOL bColor = FALSE;CDC MemDC; MemDC.CreateCompatibleDC( pDC );CBitmap MemBitmap;MemBitmap.CreateCompatibleBitmap ( pDC, Rect.right, Rect.bottom ) ;CBitmap *p01dBitmap = MemDC.SelectObject ( &MemBitmap );if( bColor )MemDC.SelectStockObject ( WHITE_PEN ); elseMemDC.SelectStockObject ( BLACK_PEN ) ; bColor = ! bColor;for( int i=0; KRect.right; i++ ){ MemDC.MoveTo ( i, O ) ; MemDC.LineTo ( i, Rect.bottom ) ;}pDC->BitBlt( O, O, Rect.right, Rect.bottom, SMemDC, O, O, SRCCOPY ) ;MemDC.SelectObject ( pOldBitmap );Podwójne buforowaniePoni¿sze kroki podsumowuj ¹ proces buforowania serii operacji rysunkowych:1.Utwórz kontekst urz¹dzenia coc zgodny z kontekstem obszaru roboczego okna.2.Utwórz bitmapê klasy CBitmap zgodn¹ z kontekstem urz¹dzenia.3.W kontekœcie CDC wybierz bitmapê CBitmap; zachowaj wskaŸnik do poprzednio wybranej bitmapy, abyœ móg³ j¹ póŸniej odtworzyæ.4.Wszystkie operacje graficzne wykonaj w nowo utworzonym kontekœcie CDC.5.Za pomoc¹ funkcji BitBit () szybko przerzuæ nowo utworzon¹ bitmapê CBitmap do kontekstu obszaru roboczego okna.6.W kontekœcie urz¹dzenia CDC wybierz poprzedni¹ bitmapê.Obiekty CDC i CBitmap zostan¹ usuniête przez ich destruktory.PodsumowanieW tym rozdziale nauczy³eœ siê, jak tworzyæ i u¿ywaæ w klasie CBitmap bitmap zale¿nych od urz¹dzenia.Pozna³eœ tak¿e palety oraz klasê CPalette oraz ich znaczenie w przypadku trybów graficznych o oœmiu bitach na piksel.Wiesz ju¿ tak¿e, w jaki sposób u³atwiæ sobie manipulowanie bitmapami niezale¿nymi od sprzêtu, wykorzystuj¹c w tym celu stworzon¹ przez nas klasê CDib.Bitmapy zale¿ne i niezale¿ne od sprzêtu s¹ wydajnym i elastycznym narzêdziem.W czasach gdy wszystkie aplikacje dzia³aj¹ w œrodowisku graficznym, trudno nie doceniaæ ich przydatnoœci.Teraz, gdy ju¿ przeczyta³eœ ten rozdzia³, powinieneœ wzi¹æ siê samemu do roboty i trochê poeksperymentowaæ
[ Pobierz całość w formacie PDF ]