Win32 C++ 调整窗口大小在 RDP 中留下工件
Posted
技术标签:
【中文标题】Win32 C++ 调整窗口大小在 RDP 中留下工件【英文标题】:Win32 C++ Resizing Window Leaves Artifacts in RDP 【发布时间】:2015-08-10 22:42:35 【问题描述】:我有一个简单的 Win32 程序,它执行以下操作
1) 创建一个窗口
HWND hWnd = CreateWindowEx(
WS_EX_LEFT |
WS_EX_LTRREADING |
WS_EX_RIGHTSCROLLBAR |
WS_EX_WINDOWEDGE |
WS_EX_APPWINDOW,
wc.lpszClassName,
L"App Name",
WS_CAPTION |
WS_VISIBLE |
WS_CLIPSIBLINGS |
WS_CLIPCHILDREN |
WS_SYSMENU |
WS_OVERLAPPED |
WS_MINIMIZEBOX, 0, 0, 540, 180, 0, 0, hInstance, NULL);
然后
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
switch (message)
case WM_PAINT:
HDC hdc;
hdc = BeginPaint(hWnd, &ps);
// code here (not shown) calculates pixel size of text with GetTextExtentPoint32
// resizes window to fit text with MoveWindow
MoveWindow(hWnd, rect.left, rect.top, rect.right - rect.left, height + borderSize, false);
// writes text to window with DrawText
EndPaint(hWnd, &ps);
break;
case WM_CLOSE:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
这在桌面上运行良好,没有问题,窗口看起来很好并且按预期显示。
但是在 RDP 上存在以下工件:
调整大小后的 Window 版本仍然存在,即您可以同时看到旧边框和新边框 创建窗口的背景中的图像混合到窗口中 在屏幕上移动窗口不会移除伪影 最小化窗口并再次打开它确实会删除工件如果我最小化远程桌面客户端并切换回它,则窗口会按预期显示。
其他程序在 RDP 会话期间不会显示此行为。
RDP 客户端在 Win10 x64 上,目标机器是 Server 2008 R2 或 Windows 7 SP1 x64。
尝试在 MoveWindow 中将 repaint 设置为 TRUE,但这没有任何影响。
【问题讨论】:
WM_PAINT
是您计算窗口大小的最佳选择吗?对我来说,你在油漆处理程序中做任何可能触发更多油漆的事情似乎本质上是危险的。
在WM_PAINT
处理程序中移动一个窗口看起来不是一个理想的解决方案。与您的问题无关,但 ORing WS_OVERLAPPED 没有任何用处。
好的,我可以把它移出来,我通常写控制台程序而不是 GUI。但是我认为使用 bRepaint = false 它不应该触发更多的绘画。
至于 WS_OVERLAPPED 的使用,我使用它的唯一原因是我正在重新创建一个 WPF 程序,这就是它传递给 CreateWindow 的原因
我认为你应该只将绘图部分保留在 WM_PAINT 中,理想情况下要绘制的内容在其他地方。
【参考方案1】:
通过从我的 CreateWindowEx 命令中删除 WS_VISIBLE 来解决此问题,首先调整窗口大小,然后在调整窗口大小后调用
ShowWindow(hWnd,SW_SHOW);
我还从 WM_PAINT 中删除了窗口调整大小,但这并没有解决问题。
【讨论】:
以上是关于Win32 C++ 调整窗口大小在 RDP 中留下工件的主要内容,如果未能解决你的问题,请参考以下文章