Windows,恢复窗口错误

时间:2016-05-07 12:48:57

标签: windows winapi rendering restore

我正在玩Windows和D2D1 但是在恢复最小化的无边框/无菜单窗口时 有时我会得到这个非常丑陋的bug

enter image description here

对于使用D2D1绘制窗口之前的帧(或更多帧) 它将显示带有窗口名称的标题栏。 大约5-10%的恢复操作会发生这种情况。

窗口类样式设置为

CS_DBLCLKS|CS_OWNDC

但我也尝试了其他风格。

使用CreateWindowWS_POPUP|WS_SYSMENU dwStyle

创建窗口

我的渲染方法在WM_PAINT上调用,但我也尝试将其移动 每次都会被调用,但这没有用。

感谢任何帮助:)

我找到了一个我并不完全正确的解决方法 而不是致电ShowWindow(hWnd, SW_RESTORE) 我打电话给

ShowWindow(hWnd, SW_HIDE);
ShowWindow(hWnd, SW_RESTORE);
ShowWindow(hWnd, SW_SHOW);

然而,这导致任务栏图标被更新"我也不想要。

具有此问题的简短示例代码(最小化/恢复时)

#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;
}

1 个答案:

答案 0 :(得分:0)

自己找到解决方案: 最小化和恢复无边框窗口 是未定义的行为。 解决方法是捕获WM_NCPAINT并绘制整个WHOLE 窗口自己(即使它没有边框,它有一个非客户区域)。