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?