【发布时间】:2016-05-07 12:48:57
【问题描述】:
我在玩 Windows 和 D2D1 但是,当恢复我最小化的无边框/无菜单窗口时 有时我会遇到这个非常丑陋的错误
在使用 D2D1 绘制窗口之前的一帧(或更多帧) 它将显示带有窗口名称的标题栏。 大约 5-10% 的恢复操作会发生这种情况。
窗口类样式设置为
CS_DBLCLKS|CS_OWNDC
但我也尝试过其他风格。
窗口是用CreateWindow 和WS_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