SW_RESTORE Bug



  • Hi!

    Ich habe ein Fenster ohne Rand oder Menü und dieses minimiert.
    Nun besteht aber ein kleines störendes Problem.
    Und zwar wenn ich das Fenster wiederherstelle, dann
    kann es dazu kommen, dass für einige Bruchteile nicht mein Fenster
    gezeichnet wird, sondern eine im Fensterzeile im NT Stil.
    Das geschieht zwar nicht immer, aber man merkt es wenn man
    des Öfteren minimiert und wiederherstellt.

    Hier mal ein Link zu einem Bild von dem Problem:
    http://i.imgur.com/GF6qVwY.png

    Hier mal kurzer Beispielcode der auch unter dem Problem leidet:

    #include <Windows.h>
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prevInstance, LPSTR cmd, int cmdShow)
    {
    	WNDCLASSEX TestWC = { 0 };
    	TestWC.cbSize = sizeof(WNDCLASSEX);
    	TestWC.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(50, 50, 50));
    	TestWC.lpfnWndProc = DefWindowProc;
    	TestWC.lpszClassName = "Testklasse";
    	TestWC.style = CS_DBLCLKS | CS_OWNDC;
    	TestWC.hCursor = LoadCursor(NULL, IDC_ARROW);
    	RegisterClassEx(&TestWC);
    
    	HWND htest = CreateWindow("Testklasse", "Test", WS_POPUP | WS_SYSMENU|WS_VISIBLE, 200, 200, 400, 248, 0, 0, 0, 0);
    
    	MSG wMsg = { 0 };
    	bool shown = true;
    	while (wMsg.message != WM_QUIT)
    	{
    		if (PeekMessage(&wMsg, NULL, 0, 0, PM_REMOVE))
    		{
    			TranslateMessage(&wMsg);
    			DispatchMessage(&wMsg);
    		}
    		if (GetAsyncKeyState(VK_INSERT) & 0x8000 && shown)
    		{
    			shown = false;
    			ShowWindow(htest, SW_MINIMIZE);
    			continue;
    		}
    		if (GetAsyncKeyState(VK_DELETE) & 0x8000 && !shown)
    		{
    			shown = true;
    			ShowWindow(htest, SW_RESTORE);
    			continue;
    		}
    		if (GetAsyncKeyState(VK_END) & 0x8000)
    			PostQuitMessage(1);
    		Sleep(50);
    	}
    	return 1;
    }
    

    Hoffe jemand hat eine Lösung parat oder kann mich auf den richtigen Weg bringen 🙂



  • Habe die Lösung selber gefunden.

    Grund:
    Popupfenster (ohne Rand!) sind nicht dazu gedacht minimiert zu werden
    (Alt+- oder Windows+M funktionieren bei ihnen nicht)
    Insofern führt minimieren und wiederherstellen solcher zu
    "undefined behaviour".
    Workaround:
    WM_NCPAINT abfangen, denn damit ist man für das komplette Fenster zuständig
    und nicht nur für den Clientbereich.

    Kann geschlossen werden 🙂


Log in to reply