Hi Leute,
ich bin grad dabei ein DirectDraw Prgramm zu schreiben. Da es mein erstes sein wird schreibe ich das meißte da bei aus einem Tutorial im Internet ab(für Interessierte:/www.codeworx.org)
Nun hab ich aber ein Problem wenn ich das Prgramm beende, durch Drücken der ESC-Taste dann versopft es meinen Pc, so dass mein Pc voll ausgelastet ist.Da muss ja irgentwas schief gelaufen sein, da ich aber noch ein Anfänger bin,weiß ich nicht was-Wäre nett wenn mir einer (oder alle) helfen würde. Hier ist der Code:
ich bin grad dabei ein DirectDraw Prgramm zu schreiben. Da es mein erstes sein wird schreibe ich das meißte da bei aus einem Tutorial im Internet ab(für Interessierte:/www.codeworx.org)
Nun hab ich aber ein Problem wenn ich das Prgramm beende, durch Drücken der ESC-Taste dann versopft es meinen Pc, so dass mein Pc voll ausgelastet ist.Da muss ja irgentwas schief gelaufen sein, da ich aber noch ein Anfänger bin,weiß ich nicht was-Wäre nett wenn mir einer (oder alle) helfen würde. Hier ist der Code:
Code:
#include <windows.h>
#include <ddraw.h>
#define WindowTitle "DirectDraw-Tutorial"
#define WindowClassName "DDWinClass"
bool running;
LPDIRECTDRAW7 lpDirectDraw; // DirectDraw-Objekt
LPDIRECTDRAWSURFACE7 lpddsPrimary;
LPDIRECTDRAWSURFACE7 lpddsBack;
DDSURFACEDESC2 ddsd;
DDSCAPS2 ddscaps;
HRESULT ddrval;
DDBLTFX ddbltfx;
RECT fill_area;
bool InitDDraw(HWND hwnd)
{
ddrval = DirectDrawCreateEx(NULL, (VOID**)&lpDirectDraw, IID_IDirectDraw7, NULL);
if (ddrval != DD_OK)
{
return false;
}
ddrval = lpDirectDraw->SetCooperativeLevel (hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
if (ddrval != DD_OK)
{
lpDirectDraw->Release();
lpDirectDraw = NULL;
return false;
}
ddrval = lpDirectDraw->SetDisplayMode (800, 600, 8, 0, 0);
if (ddrval != DD_OK)
{
lpDirectDraw->Release();
lpDirectDraw = NULL;
return false;
}
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount = 1;
ddrval = lpDirectDraw->CreateSurface (&ddsd, &lpddsPrimary, NULL);
if (ddrval != DD_OK)
{
lpDirectDraw->Release();
lpDirectDraw = NULL;
return false;
}
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
lpddsPrimary->GetAttachedSurface(&ddscaps, &lpddsBack);
return true;
}
void SpecialInit()
{
ddbltfx.dwSize = sizeof(DDBLTFX);
ddbltfx.dwFillColor = RGB(0, 0, 0);
SetRect(&fill_area, 0, 0, 800, 600);
}
void ReleaseDDraw() //lert den speicher aus,wenn nötig
{
if (lpDirectDraw != NULL)
{
lpDirectDraw->Release();
lpDirectDraw = NULL;
}
if(lpddsPrimary!=NULL)
{
lpddsPrimary->Release();
lpddsPrimary = NULL;
}
if (lpddsBack != NULL)
{
lpddsBack->Release();
lpddsBack = NULL;
}
}
LONG FAR WINAPI WndProc (HWND , UINT , UINT , LONG) ;
int WINAPI WinMain (HINSTANCE hInstance , HINSTANCE hPrevInstance ,
LPSTR lpCmdLine , int nCmdShow)
{
MSG msg ;
HWND hwnd ;
WNDCLASS wndclass ;
if (!hPrevInstance)
{
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL , IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL , IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH)GetStockObject (LTGRAY_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = WindowClassName ;
RegisterClass (&wndclass) ;
}
hwnd = CreateWindow (WindowClassName ,
WindowTitle ,
WS_OVERLAPPEDWINDOW ,
CW_USEDEFAULT ,
CW_USEDEFAULT ,
CW_USEDEFAULT ,
CW_USEDEFAULT ,
NULL , NULL ,
hInstance , NULL) ;
ShowWindow (hwnd , nCmdShow) ;
UpdateWindow (hwnd) ;
if(!InitDDraw(hwnd))
{
MessageBox(NULL,"Konnte DirectX nicht initialisieren","ERROR",MB_OK|MB_ICONEXCLAMATION);
return 0;
}
SpecialInit();
running=true;
while(running)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if (msg.message == WM_QUIT) break;
TranslateMessage(&msg);
DispatchMessage(&msg);
lpddsBack->Blt(&fill_area, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx);
while(lpddsPrimary->Flip(NULL, DDFLIP_WAIT) != DD_OK);
}
}
return msg.wParam ;
}
LONG FAR WINAPI WndProc (HWND hwnd , UINT message ,
UINT wParam , LONG lParam)
{
switch (message)
{
case WM_DESTROY:
{
PostQuitMessage (0) ;
return 0 ;
} break;
case WM_KEYDOWN:
switch(wParam)
{
case VK_ESCAPE:
PostMessage(hwnd,WM_CLOSE,0,0);
//running=false;
break;
}break;
} // switch (message)
return DefWindowProc (hwnd , message , wParam , lParam) ;
} // WndProc