DirectDraw problem z wyświetleniem bitmapy

0

Witam znalazłem w internecie kurs DirectDraw. Tylko mam problem, gdyż na lekcji gdzie jest omawiane wyświetlanie bitmapy, program się dziwnie zachowuje. Bitmapa pojawia się na krótką chwilkę i znika. Oto kod programu (Przekopiowałem plik źródłowy udostępniony przez autora kursu. Strona ostatnio była aktualizowana dawno temu, dlatego pytanie kieruję tutaj na forum):

#include <windows.h>
#include <ddraw.h>
//==============================================================================
HWND hOkno;                            //Uchwyt głównego okna aplikacji
LPDIRECTDRAW lpDD = NULL;              //Wskaźnik do obiektu DirectDraw
LPDIRECTDRAWSURFACE lpDDEkran = NULL;  //Wskaźnik na powierzchnię ekranu
//==============================================================================
bool UtworzOknoDlaDD(HWND *hWnd, LPSTR lpszTyt);
bool UtworzObiektyDD();
void ZwolnijObiektyDD();
LRESULT CALLBACK ProcOkna(HWND hOkno, UINT uMsg, WPARAM wPar, LPARAM lPar);
//==============================================================================
// W tej funkcji program rozpoczyna swoje działanie
//------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hProgram, HINSTANCE, LPSTR, int swPokaz)
{
 if (!UtworzOknoDlaDD(&hOkno,"Kurs DirectDraw - Program 2")) return false;
 ShowWindow(hOkno,swPokaz);

 //Utworzenie obiektów DirectDraw
 if (!UtworzObiektyDD()) return false;


 MSG msg;
 while(GetMessage(&msg,NULL,0,0))
 {
  TranslateMessage(&msg);  DispatchMessage(&msg);
 }

 return msg.wParam;
}
//==============================================================================
// Ta funkcja tworzy i inicjuje wszystkie potrzebne obiekty Direct Draw
//------------------------------------------------------------------------------
bool UtworzObiektyDD()
{
 //Utworzenie głównego obiektu DirectDraw
 if ( DirectDrawCreate(NULL,&lpDD,NULL) != DD_OK) {
    MessageBox(hOkno,"Nie dało się utworzyć obiektu DD","Błąd:",0);
    ZwolnijObiektyDD();  return false;
 }
 lpDD->SetCooperativeLevel(hOkno, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
 lpDD->SetDisplayMode(640, 480, 16);  //Ustawiamy tryb 640x480, 65536 kolorów

 //Utworzenie powierzchni ekranu
 DDSURFACEDESC ddsd;
 ddsd.dwSize         = sizeof(ddsd);
 ddsd.dwFlags        = DDSD_CAPS;
 ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
 if ( lpDD->CreateSurface(&ddsd,&lpDDEkran,NULL) != DD_OK) {
    MessageBox(hOkno,"Nie dało się utworzyć buforów ekranu","Błąd",0);
    ZwolnijObiektyDD();  return false;
 }

 //Wczytanie bitmapy do pamięci
 HBITMAP bitmapa;
 bitmapa = (HBITMAP) LoadImage(NULL,"..\\Grafika\\Obrazek.bmp",
                               IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
 if(bitmapa==NULL) {
    MessageBox(hOkno,"Nie dało się wczytać bitmapy","Błąd",0);
    ZwolnijObiektyDD();  return false;
 }
 //Utworzenie kontekstu pomocniczego dla bitmapy
 HDC pomocniczy = CreateCompatibleDC(NULL);
 SelectObject(pomocniczy,bitmapa);
 //Wysłanie bitmapy na powierzchnię ekranu
 HDC hdc;
 if (lpDDEkran->GetDC(&hdc) == DD_OK) {
      BitBlt(hdc,0,0,293,169,pomocniczy,0,0,SRCCOPY);
      lpDDEkran->ReleaseDC(hdc);
 }
 //Usunięcie bitmapy z pamięci
 DeleteDC(pomocniczy);
 DeleteObject(bitmapa);

 return true;
}
//==============================================================================
// Ta funkcja zwalnia wszystkie utworzone obiekty Direct Draw
//------------------------------------------------------------------------------
void ZwolnijObiektyDD()
{
 //Jeśli obiekt jeszcze jest, zwolnij go i unieważnij wskaźnik
 if(lpDDEkran != NULL) lpDDEkran->Release(); lpDDEkran = NULL;
 if(lpDD      != NULL) lpDD->Release();      lpDD = NULL;
}
//==============================================================================
// Ta funkcja obsługuje komunikaty przychodzące do okna
//------------------------------------------------------------------------------
LRESULT CALLBACK ProcOkna(HWND hOkno, UINT uMsg, WPARAM wPar, LPARAM lPar)
{
 switch(uMsg) {

  case WM_KEYDOWN:
     if (wPar == VK_ESCAPE) DestroyWindow(hOkno);
  break;

  case WM_DESTROY:
     PostQuitMessage(0);
  break;

 };
 return DefWindowProc(hOkno,uMsg,wPar,lPar);
}
//==============================================================================
// Ta funkcja tworzy główne okno aplikacji dla DirectDraw
//------------------------------------------------------------------------------
bool UtworzOknoDlaDD(HWND *hWnd, LPSTR lpszTyt)
{
 HINSTANCE hProg = GetModuleHandle(NULL);

 WNDCLASS wc;
 wc.lpszClassName = "Kurs DirectDraw";
 wc.hInstance     = hProg;
 wc.lpfnWndProc   = ProcOkna;
 wc.style         = 0;
 wc.hIcon         = LoadIcon(NULL,IDI_WINLOGO);
 wc.hCursor       = LoadCursor(NULL,IDC_ARROW);
 wc.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);
 wc.lpszMenuName  = NULL;
 wc.cbClsExtra    = 0;
 wc.cbWndExtra    = 0;
 if(!RegisterClass(&wc)) return false;

 *hWnd = CreateWindowEx(0,"Kurs DirectDraw",lpszTyt,WS_POPUP,
                        50,50,300,200,
                        NULL,NULL,hProg,NULL);
 if(*hWnd==NULL) return false;
 else return true;
}

Jest ktoś w stanie pomóc?

0

Nie znam DirectDraw, ale myślę, że tak się dzieje, bo nie wyświetlasz obrazka w pętli, chyba powinieneś taką mieć, do rysowania.

0

Hmm w pozostałych programach podczas rysowania nie ma ciągłej pętli (a programy działają poprawnie). A z treści kursu wynika iż takowa pętla jest nie potrzebna podczas rysowania.

0

A nie kasujesz gdziesz zasobów lub ich nie zwalniasz? Przeanalizuj kod jeszcze raz. Pisałeś go z tutka czy wkleiłeś i pozmieniałeś kilka rzeczy?

0

Kod który tutaj jest, został udostępniony przez autora kursu w dziale "pliki do pobrania", wraz z skompilowanym plikiem. Program *.exe który autor kursu dołączył zachowuje się identycznie.

0 użytkowników online, w tym zalogowanych: 0, gości: 0