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


Anmelden zum Antworten