Windowsfenster aufblitzen verhindern



  • Ich arbeite gerade mit DirectX an einer kleinen Lösung um das kurze Aufblitzen des Fensters bevor DX initialisiert und im Fullscreen ist. Leider finde ich dazu keine richtig funktionierende Lösung. Meine Idee besteht darin das Fenster zu erstellen und in die dem Modus entsprechende größe zu bringen so das man einfach zwischen Fullscreen und Window Mode hin und herschalten kann.

    Ich habe es bisher mit diesen Versionen Probiert.

    CreateWindow (WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX)
    MoveWindow (für größe)
    DirectX initialisieren
    ShowWindow

    und

    CreateWindow ( WS_POPUP, größe 1x1 so das es nicht sichtbar wird)
    ShowWindow
    DirectX initialisieren
    SetWindowLong (WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX)
    MoveWindow
    ShowWindow

    Ich habe noch einige Varianten mit SetWindowPos getestet, alles läuft allerdings darauf hinaus das änderungen am Fenster dazu führen das Alt+Enter aufrufe darin enden das das Fenster sich Quasi minimiert und dann nichtmehr hoch will, bzw SetFullscreenState(false,NULL) einfach garkeine Wirkung mehr hat.

    Gibt es für dieses Problem einen eleganten Ansatz der einerseits dafür sorgt das man am ende nicht nur ein 1x1 Pixel Popup hat und andererseits keine Probleme beim hin und herwechseln der Modi?



  • Ich hab keine Ahnung was für ein "aufblitzen" du meinst:

    LPDIRECT3D9 d3d;
    
    int WINAPI WinMain(
    	HINSTANCE hInstance,
    	HINSTANCE hPrevInstance,
    	LPSTR 	  lpCmdLine,
    	int       nCmdShow
    )
    {
    	//[...]
    
    	HWND hWnd = CreateWindowEx(
    		NULL, 
    		L"WindowClass", 
    		L"Direct3D Program",
    		/*WS_OVERLAPPEDWINDOW "windowed"*/WS_EX_TOPMOST | WS_POPUP, 
    		0, 0, 
    		SCREEN_WIDTH, SCREEN_HEIGHT,
    		NULL, 
    		NULL, 
    		hInstance, 
    		NULL
    	);
    
    	initD3D(hWnd, FALSE);
    
    	//[...]
    
    	while(TRUE)
    	{
    		while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    		{
    			TranslateMessage(&msg);
    			DispatchMessage(&msg);
    		}
    
    		if(msg.message == WM_QUIT)
    			break;
    
    		render_frame();
    
    		if( KEY_DOWN(VK_F12) )
    		{
    			if( bInFullScreenMode )
    			{
    				cleanD3D();
    				SetWindowLong(hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW);
    				UpdateWindow(hWnd);
    				ShowWindow(hWnd, SW_SHOWDEFAULT); 
    				initD3D(hWnd, TRUE);
    				bInFullScreenMode = FALSE;
    			}
    		}
    		else if( KEY_DOWN(VK_F11) )
    		{
    			if( !bInFullScreenMode )
    			{
    				cleanD3D();
    				initD3D(hWnd, FALSE);
    				bInFullScreenMode = TRUE;
    			}
    		}
        }
    }
    
    void initD3D(HWND hWnd, BOOL bWindowed)
    {
    	//[...]
    	D3DPRESENT_PARAMETERS d3dpp;
    	d3dpp.Windowed = bWindowed;
    
        d3d->CreateDevice(
    		D3DADAPTER_DEFAULT,
            D3DDEVTYPE_HAL,
            hWnd,
            D3DCREATE_SOFTWARE_VERTEXPROCESSING,
            &d3dpp,
            &d3ddev);
    	//[...]
    }
    


  • Mein Problem erstreckt sich darauf das ich versuche verschiedene Dinge zu ermöglichen wenn DX läuft bzw das Fenster startet. ZB änderungen am Fensterstyle oder anzeige nachdem DirectX initialisiert wurde. Und genau hier funktioniert es nicht so wie ich es erwarte.

    Wenn ich das Fenster direkt anzeigen wenn ichs erstelle bevor DirectX initialisiert ist ist alles schick. Sobald ich das fenster anzeigen will nachdem DirectX initialisiert wurde gibts nichts als Probleme, da sist auch wa sich mit Aufblitzen meinte, der Moment wenn das Fenster schon sichtbar ist bis DirectX initialisiert ist. Ich fidne allerdings keine wirkliche Lösung für das Problem, scheibar arbeitet DirectX hier einfach schlecht mit den Fenstern zusammen. Wenn ich im Fullscreen arbeiten will und ich nach DX initialisierung mit einem SW_SHOW oder SW_SHOWNORMAL das Fenster das erste mal anzeigen will gibts Probleme beim wechseln ind en fenstermodus (da ist dann nochmal ein SW_SHOW nötig) und bei Alt-Tab (hier bleiben schwarze Flecken übrig), für Alt_Tab muß man erst SW_SHOWMINNOACTIVE machen damit es geht.

    Nach etlichem rumprobieren denke ich mal das es wohl einfach nicht erdacht ist das man das Fenster nach der initialisierung von DX anzeigt oder groß ändert. Bin aber für jede weietre Idee dankbar.



  • Kannst du vlt. mal deinen Source hochladen? Was genau willst du denn alles während des Programmablaufs ändern können? Die Größe geht wie in meinem Beispiel beschrieben problemlos.



  • FrEEzE2046 schrieb:

    Die Größe geht wie in meinem Beispiel beschrieben problemlos.

    Ich habe gerade gesehen das ich vergessen hatte zu erwähnen das ich DirectX11 benutze, dein Beispiel ist für 9. Scheinbar wird durch das DXGI einiges verschluckt bzw es ist an einigen Stellen etwas zickig.


Anmelden zum Antworten