Titelleiste im fullscreen
-
Hi!
Sorry, dass ich hier so nen langen quelltext posten muss. Doch ich hab anhand eines Tutorials mir ein kleines DirectDraw Programm geschrieben, wo es erst mal initialisiert wird und dann der hintergrund schwarz gezeichnet wird. Doch oben ist trotz fullscreen immernoch die titelleiste zu sehen. Ich kann den Fehler einfach nicht finden. In der Original-Source-Datei des Tutorials ist die Titelleiste nicht zu sehen, aber ich kann keine Unterschiede finden...
Mein Sourcecode:
#include <windows.h> #include <ddraw.h> LPDIRECTDRAW7 lpDirectDraw; HRESULT ddrval; LPDIRECTDRAWSURFACE7 lpddsPrimary; DDSURFACEDESC2 ddsd; LPDIRECTDRAWSURFACE7 lpddsBack; DDSCAPS2 ddscaps; DDBLTFX ddbltfx; RECT fill_area; bool running; int InitDirectDraw(HWND); int CreateSurfaces(void); void CleanDirectDraw(void); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; HWND hWnd; WNDCLASS wc; int check; char szName[]="Fensterklasse"; wc.cbClsExtra=0; wc.cbWndExtra=0; wc.hbrBackground=0; wc.hCursor=LoadCursor(NULL, IDC_ARROW); wc.hIcon=LoadIcon(NULL, IDI_APPLICATION); wc.hInstance=hInstance; wc.lpfnWndProc=WndProc; wc.lpszClassName=szName; wc.lpszMenuName=0; wc.style=CS_VREDRAW | CS_HREDRAW; RegisterClass(&wc); hWnd=CreateWindow(szName, "FloDX", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); check=InitDirectDraw(hWnd); if(check!=1) { return 0; } check=CreateSurfaces(); if(check!=1) { return 0; } running=true; while(GetMessage(&msg, 0, 0, 0)) { if (!running) break; TranslateMessage(&msg); DispatchMessage(&msg); } CleanDirectDraw(); return msg.wParam ; } LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_KEYDOWN: if(wParam==VK_ESCAPE) { running=false; } return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hWnd, msg, wParam, lParam) ; } int InitDirectDraw(HWND hWnd) { ddrval=DirectDrawCreateEx(NULL, (VOID**)&lpDirectDraw, IID_IDirectDraw7, NULL); if (ddrval != DD_OK) { return 0; } ddrval = lpDirectDraw->SetCooperativeLevel (hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); if (ddrval != DD_OK) { lpDirectDraw->Release(); lpDirectDraw=NULL; return 0; } ddrval = lpDirectDraw->SetDisplayMode (640, 480, 8, 0, 0); if (ddrval != DD_OK) { lpDirectDraw->Release(); lpDirectDraw = NULL; return 0; } return 1; } int CreateSurfaces(void) { 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 (0); } ddscaps.dwCaps = DDSCAPS_BACKBUFFER; lpddsPrimary->GetAttachedSurface(&ddscaps, &lpddsBack); ddbltfx.dwSize = sizeof(DDBLTFX); ddbltfx.dwFillColor = RGB(0, 0, 0); SetRect(&fill_area, 0, 0, 640, 480); return 1; } void CleanDirectDraw(void) { if (lpddsBack != NULL) { lpddsBack->Release(); lpddsBack = NULL; } if (lpddsPrimary != NULL) { lpddsPrimary->Release(); lpddsPrimary = NULL; } if (lpDirectDraw != NULL) { lpDirectDraw->Release(); lpDirectDraw = NULL; } }
Der "Original" Sourcecode:
#include <windows.h> #include <ddraw.h> #define WindowTitle "DirectDraw-Tutorial" #define WindowClassName "DDWinClass" LPDIRECTDRAW7 lpDirectDraw; // DirectDraw-Objekt HRESULT ddrval; LPDIRECTDRAWSURFACE7 lpddsPrimary; LPDIRECTDRAWSURFACE7 lpddsBack; LPDIRECTDRAWSURFACE7 lpddsBitmap; DDSURFACEDESC2 ddsd; DDSCAPS2 ddscaps; DDBLTFX ddbltfx; RECT fill_area; RECT rectbitmap; bool running; LONG FAR WINAPI WndProc (HWND , UINT , UINT , LONG) ; int WINAPI WinMain (HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow) { MSG msg ; HWND hwnd ; WNDCLASS wc ; if (!hPrevInstance) { wc.cbClsExtra=0; wc.cbWndExtra=0; wc.hbrBackground=0; wc.hCursor=LoadCursor(NULL, IDC_ARROW); wc.hIcon=LoadIcon(NULL, IDI_APPLICATION); wc.hInstance=hInstance; wc.lpfnWndProc=WndProc; wc.lpszClassName=WindowClassName; wc.lpszMenuName=0; wc.style=CS_VREDRAW | CS_HREDRAW; RegisterClass(&wc); } hwnd=CreateWindow(WindowClassName, "FloDX", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow (hwnd , nCmdShow) ; UpdateWindow (hwnd) ; ddrval=DirectDrawCreateEx(NULL, (VOID**)&lpDirectDraw, IID_IDirectDraw7, NULL); if (ddrval != DD_OK) { return 0; } ddrval = lpDirectDraw->SetCooperativeLevel (hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); if (ddrval != DD_OK) { lpDirectDraw->Release(); lpDirectDraw=NULL; return 0; } ddrval = lpDirectDraw->SetDisplayMode (640, 480, 8, 0, 0); if (ddrval != DD_OK) { lpDirectDraw->Release(); lpDirectDraw = NULL; return 0; } 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 (0); } ddscaps.dwCaps = DDSCAPS_BACKBUFFER; lpddsPrimary->GetAttachedSurface(&ddscaps, &lpddsBack); ddbltfx.dwSize = sizeof(DDBLTFX); ddbltfx.dwFillColor = RGB(0, 0, 0); SetRect(&fill_area, 0, 0, 640, 480); running=true; while(running) { if (GetMessage(&msg,NULL,0,0)) { if (msg.message == WM_QUIT) break; TranslateMessage(&msg); DispatchMessage(&msg); lpddsBack->Blt(&fill_area, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx); lpddsBack->Blt(&rectbitmap, lpddsBitmap, NULL, DDBLT_WAIT, NULL); while(lpddsPrimary->Flip(NULL, DDFLIP_WAIT) != DD_OK); } } if (lpddsBack != NULL) { lpddsBack->Release(); lpddsBack = NULL; } if (lpddsPrimary != NULL) { lpddsPrimary->Release(); lpddsPrimary = NULL; } if (lpDirectDraw != NULL) { lpDirectDraw->Release(); lpDirectDraw = NULL; } return msg.wParam ; } LONG FAR WINAPI WndProc (HWND hwnd , UINT message , UINT wParam , LONG lParam) { switch (message) { case WM_KEYDOWN: { switch (wParam) { case VK_ESCAPE: running=false; return 0; } break; } case WM_DESTROY: { PostQuitMessage (0) ; return 0 ; } break; } // switch (message) return DefWindowProc (hwnd , message , wParam , lParam) ; } // WndProc
Tut mir Leid, wenn ihr euch so viel durchlesen müsst, doch ich kann den Fehler nicht lokalisieren.
Danke schonmal für eure Hilfe,
FloLabu
-
Probier mal, WS_OVERLAPPEDWINDOW bei wc.style mit anzugeben.
-
Nee, klappt leider auch nicht. Es scheint aber zu funktionieren, wenn ich das fenster statt mit WS_OVERLAPPEDWINDOW mit WS_POPUP erstelle, dass es dann geht... Ist doch auch ok, oder?
Trotzdem danke,
FloLabu