【问题标题】:Windows, restoring window bugWindows,恢复窗口错误
【发布时间】:2016-05-07 12:48:57
【问题描述】:

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

在使用 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;
}

【问题讨论】:

  • “我的渲染方法是在 WM_PAINT 上调用的,但我也尝试移动它,以便每次都调用它” - 不知道这是什么意思。
  • 我认为可能会出现该错误,因为在我的窗口被我的绘图功能涂黑之前,在恢复时处理了其他消息。然而事实并非如此,即使不绘制任何东西并使用 DefWindowProc 也会发生上述错误
  • 请出示您的代码。其他东西(可能与 Direct2D 无关,因此请显示完整的程序)可能是错误的。是的,您确实希望在WM_PAINT 中有您的渲染代码,即使使用 Direct2D;检查 Direct2D 示例。
  • 完成了,顺便说一句,我知道我快要绝望了
  • 确实很重要。如果您将消息处理限制为每 50 毫秒不超过一条消息,那么您将无缘无故地减慢应用程序的响应速度。如果您需要帮助,请发布您需要帮助的代码。如果您在其消息循环中发布包含Sleep 的代码,人们将继续要求您将其删除。也有充分的理由。

标签: windows winapi rendering restore


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-03-29
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多