[ Pobierz całość w formacie PDF ]
.od wyczyszczenia ekranu).Zasadę podwójnego buforowania oraz sposób utworzenia bufora powierzchni podstawowej ilustruje fragment programu przedstawiony na wydruku 26.16.Wydruk 26.16.Utworzenie bufora powierzchni podstawowej DirectDraw// deklaracja globalna lub w klasieLPDIRECTDRAWSURFACE3 pPrimarySurface,pBackBuffer;bool CreateSurfaces(void){HRESULT DDError;// Poniższe struktury pozwalają zdefiniować właściwości powierzchni.DDSURFACEDESC SurfaceDescription;DDSCAPS BackBufferCaps;if(DirectDraw2Interface==NULL)return(false);// Wyzeruj zawartość struktury.ZeroMemory(&SurfaceDescription, sizeof(DDSURFACEDESC));// Pole dwSize struktur musi zawsze zawierać poprawny// rozmiar struktury.SurfaceDescription.dwSize = sizeof(DDSURFACEDESC);// Pole dwFlags określa, które pola struktury zawierają informacje.SurfaceDescription.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;// Ustaw odpowiednie właściwości powierzchni:SurfaceDescription.ddsCaps.dwCaps =// powierzchnia główna (zawsze widoczna)DDSCAPS_PRIMARYSURFACE |// podwójne buforowanieDDSCAPS_FLIP |// powierzchnia złożona (związana z innymi powierzchniami -// tutaj z buforem)DDSCAPS_COMPLEX;// Używamy pojedynczego bufora.SurfaceDescription.dwBackBufferCount = 1;// Utwórz powierzchnię.DDError = DirectDraw2Interface->CreateSurface(&SurfaceDescription,(LPDIRECTDRAWSURFACE *)&pPrimarySurface, NULL);// Niepowodzenie - zwróć informację o błędzie.if(FAILED(DDError)){return(false);}// Wyzeruj bufor drugoplanowy.ZeroMemory(&BackBufferCaps, sizeof(DDSCAPS));// Tworzony bufor jest buforem drugoplanowym.BackBufferCaps.dwCaps = DDSCAPS_BACKBUFFER;// Pobierz z powierzchni głównej adres powierzchni// bufora drugoplanowego.DDError = pPrimarySurface->GetAttachedSurface(&BackBufferCaps,&pBackBuffer);// W razie niepowodzenia usuń powierzchnię główną i zwróć// informację o błędzie.if(FAILED(DDError)){// Usuń powierzchnię główną.pPrimarySurface->Release();return(false);}return(true);}Rysowanie na powierzchniach DirectDraw za pomocą funkcji GDIProste operacje graficzne na powierzchniach DirectDraw najłatwiej realizować za pomocą funkcji systemowego interfejsu GDI.Cały cykl sprowadza się do pobrania kontekstu urządzenia związanego z powierzchnią, narysowania żądanych obiektów i zwolnienia kontekstu.Pobranie kontekstu urządzenia realizuje metoda GetDC() interfejsu IDirectDrawSurface3, zaś jego zwolnienie (obligatoryjne) - metoda IDirectDrawSurface3::ReleaseDC().Samo rysowanie wykonuje się za pomocą standardowych funkcji GDI.Przykład użycia funkcji GDI do wyprowadzenia tekstu na powierzchni DirectDraw przedstawiono na wydruku 26.17.Wydruk 26.17.Wyprowadzenie tekstu na powierzchni DirectDraw za pomocą funkcji GDI// deklaracja globalna lub w klasieLPDIRECTDRAWSURFACE3 pPrimarySurface,pBackBuffer;bool TextOutDD(int x, int y, char *szText, COLORREF color,COLORREF backcolor){// Kontekst urządzeniaHDC hDeviceContext;// Wynik operacji (kod błędu)HRESULT DDError;if(pBackBuffer==NULL)return(false);// Pobierz kontekst urządzenia dla bufora drugoplanowego.DDError = pBackBuffer->GetDC(&hDeviceContext);// Niepowodzenie - zwróć informację o błędzie.if(FAILED(DDError)){return(false);}// Ustaw kolor tła tekstu.SetBkColor(hDeviceContext, backcolor);// Ustaw kolor linii (atramentu) tekstu.SetTextColor(hDeviceContext, color);// Wyprowadź tekst.::TextOut(hDeviceContext, x, y, szText, lstrlen(szText));// Zwolnij kontekst urządzenia.pBackBuffer->ReleaseDC(hDeviceContext);// Operacja zakończona pomyślnie [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • blondiii.htw.pl
  •