Windows,还原窗口错误
我在玩Windows和D2D1 但是,在恢复最小化的无边框/无菜单窗口时 有时我会有一只非常难看的虫子 在使用D2D1绘制窗口之前的一帧(或更多帧) 它将显示带有窗口名称的标题栏。 大约5-10%的恢复操作会发生这种情况 窗口类样式设置为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上被调用,但我也尝试将其移动,以便 每次都会被呼叫,但这没有帮助 感谢您
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;
}