Windows,还原窗口错误

Windows,还原窗口错误,windows,winapi,rendering,restore,Windows,Winapi,Rendering,Restore,我在玩Windows和D2D1 但是,在恢复最小化的无边框/无菜单窗口时 有时我会有一只非常难看的虫子 在使用D2D1绘制窗口之前的一帧(或更多帧) 它将显示带有窗口名称的标题栏。 大约5-10%的恢复操作会发生这种情况 窗口类样式设置为 CS_DBLCLKS|CS_OWNDC 但我也尝试过其他风格 使用CreateWindow和WS_POPUP | WS_SYSMENU作为dwStyle 我的渲染方法在WM_PAINT上被调用,但我也尝试将其移动,以便 每次都会被呼叫,但这没有帮助 感谢您

我在玩Windows和D2D1 但是,在恢复最小化的无边框/无菜单窗口时 有时我会有一只非常难看的虫子

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

窗口类样式设置为

CS_DBLCLKS|CS_OWNDC
但我也尝试过其他风格

使用
CreateWindow
WS_POPUP | WS_SYSMENU
作为
dwStyle

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

感谢您的帮助:)

# 我找到了一个我并不完全满意的解决办法 而不是调用
ShowWindow(hWnd、SW\U RESTORE)
我打电话

然而,这会导致任务栏图标被“更新”,我也不想要

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

#包括
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(空,IDC_箭头);
寄存器类(和TestWC);
HWND htest=CreateWindow(“Testklasse”,“Test”,WS|u弹出窗口| WS|u系统菜单| WS|u可见,200200400248,0,0,0);
MSG wMsg={0};
bool=true;
while(wMsg.message!=WM_退出)
{
如果(消息(&wMsg,NULL,0,0,PM_移除))
{
翻译信息(&wMsg);
调度消息(&wMsg);
}
if(GetAsyncKeyState(VK_插入)&0x8000&&显示)
{
显示=假;
显示窗口(htest、SW_最小化);
继续;
}
if(显示GetAsyncKeyState(VK_DELETE)&0x8000&&
{
显示=正确;
显示窗口(htest、SW_恢复);
继续;
}
if(GetAsyncKeyState(VK_端)&0x8000)
发帖信息(1);
睡眠(50);
}
返回1;
}
自己找到了解决方案: 最小化和恢复无边界窗口 这是一种未定义的行为。 一个解决方法是捕捉WM_NCPAINT并绘制整体
自己打开窗口(即使它是无边界的,但它有一个非客户端区域)。

“我的渲染方法在WM_PAINT上被调用,但我也尝试移动它,以便每次都被调用”-不确定这是什么意思。我认为可能会出现错误,因为在我的窗口被我的绘图功能涂成黑色之前,还原时会处理其他消息。然而,事实并非如此,即使在没有绘制任何图形和使用DefWindowProc时,也会出现上述错误。请显示您的代码。其他内容(可能与Direct2D无关,因此请显示完整的程序)可能错误。是的,您确实希望在
WM_PAINT
中使用渲染代码,即使使用Direct2D;检查Direct2D示例。完成,顺便说一句,我知道我刚开始绝望,这很重要。如果将消息处理速度限制为每50ms不超过一条消息,则毫无明显原因地会降低应用程序的响应速度。如果需要帮助,请发布需要帮助的代码。如果您在其消息循环中发布包含
Sleep
的代码,人们会继续要求您删除它。也有很好的理由。
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;
}