[ Pobierz całość w formacie PDF ]
.DDError = pPrimarySurface->Restore();// Jeśli to wywołanie się nie powiodło,// coś jest bardzo nie w porządku.if(FAILED(DDError))break;}// Jeśli rysowanie wciąż trwało, ponawiaj próby wymiany buforów.// W przeciwnym razie.else if(DDError != DDERR_WASSTILLDRAWING){// zakończ działanie i wróć tu za chwilę.break;}}}Wyświetlanie map bitowych na powierzchniach DirectDrawWyprowadzanie tekstu i rysowanie linii na powierzchniach DirectDraw to nie wszystko - bardzo pożądana byłaby możliwość wyświetlania map bitowych.Okazuje się, że i to zadanie da się wykonać bardzo prosto z pomocą komponentu TBitmap.Pierwszym etapem jest załadowanie mapy bitowej z pliku BMP (można też pobrać ją z zasobów aplikacji).Odpowiedni fragment kodu pokazano na wydruku 16.19.Wydruk 16.19.Pobranie zawartości komponentu TBitmap z pliku BMPbool TForm1::LoadBitmapIntoTBitmap(Graphics::TBitmap *&NewBitmap, AnsiString FileName){// Przypisanie NULL pozwoli sprawdzić poprawność utworzenia obiektu TBitmap.NewBitmap = NULL;// Utwórz nowy obiekt.NewBitmap = new Graphics::TBitmap();// Załaduj zawartość pliku BMP.NewBitmap->LoadFromFile(FileName);if(NewBitmap==NULL)return(false);// Udało się.return(true);}Warto zauważyć, że przekazywany do funkcji LoadBitmapIntoTBitmap() wskaźnik do obiektu klasy TBitmap nie może być zainicjalizowany - obiekt tworzony jest wewnątrz funkcji.Pomyślne wykonanie funkcji, sygnalizowane zwróceniem wartości true, oznacza, że pobrana z pliku zawartość mapy bitowej jest dostępna poprzez właściwość Canvas obiektu NewBitmap.Zmodyfikowanie funkcji tak, by pobierała mapę z zasobów aplikacji (na podstawie identyfikatora), nie nastręcza trudności - wystarczy zmienić drugi parametr na int ResourceID i zastąpić instrukcjęNewBitmap->LoadFromFile(FileName)wierszemNewBitmap->LoadFromResourceID(HInstance, ResourceID);Kolejnym krokiem jest utworzenie powierzchni przechowującej mapę bitową, reprezentowanej przez interfejs klasy IDirectDrawSurface3.Odpowiedni fragment programu przedstawiono na wydruku 16.20.Wydruk 16.20.Utworzenie powierzchni DirectDraw, zawierającej mapę bitową pobraną z komponentu TBitmapbool CreateSurfaceFromTBitmap(LPDIRECTDRAWSURFACE3 *pSurface,Graphics::TBitmap *Bitmap){// Wskaźnik do nowej powierzchniTCanvas *SurfaceCanvas;// i jej opisDDSURFACEDESC SurfaceDescription;HRESULT DDError;HDC hDeviceContext;// Wyzeruj strukturę opisującą powierzchnię.ZeroMemory(&SurfaceDescription, sizeof(DDSURFACEDESC));// Ustaw jej rozmiar.SurfaceDescription.dwSize = sizeof(DDSURFACEDESC);// Definiujemy pola rodzaju, szerokości i wysokości powierzchni.SurfaceDescription.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;// Tworzymy zwykłą powierzchnię drugoplanową.SurfaceDescription.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;// Wysokość i szerokość musi odpowiadać mapie bitowej.SurfaceDescription.dwWidth = Bitmap->Width;SurfaceDescription.dwHeight = Bitmap->Height;// Utwórz powierzchnię.DDError = DirectDraw2Interface->CreateSurface(&SurfaceDescription,(LPDIRECTDRAWSURFACE *)pSurface, NULL);// W razie niepowodzenia zwróć informację o błędzie.if(FAILED(DDError)){return(false);}// W przeciwnym razie skopiuj mapę bitową na powierzchnię.// Pobierz kontekst urządzenia powierzchni
[ Pobierz całość w formacie PDF ]