我正在玩Windows和D2D1 但是在恢复最小化的无边框/无菜单窗口时 有时我会得到这个非常丑陋的bug
对于使用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;
}
答案 0 :(得分:0)
自己找到解决方案: 最小化和恢复无边框窗口 是未定义的行为。 解决方法是捕获WM_NCPAINT并绘制整个WHOLE 窗口自己(即使它没有边框,它有一个非客户区域)。