У меня есть простая программа Win32, которая выполняет следующиеWin32 C++ Resizing Window Листья Артефакты в РДП
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);
}
Это прекрасно работает на рабочем столе без проблем, Окно выглядит отлично и отображается, как ожидалось.
Однако на ПРР следующие артефакты присутствуют:
- The предварительно изменен версии Window остается то вы можете увидеть, как старую границу и новую границу
- Изображение из фона где окна был создан смешивается в окно
- Перемещение окна вокруг экрана не удаляет артефакты
- сворачивания окна и открытия его снова делает удалить артефакты
Если я минимизирую клиент удаленного рабочего стола и вернусь к нему, окно отобразится как ожидалось.
Другие программы не показывают этого поведения во время сеанса RDP.
RDP-клиент находится на Win10 x64, целевыми машинами являются сервер 2008 R2 или Windows 7 SP1 x64.
Попытался перерисовать в TRUE в MoveWindow, но это не повлияло.
Является ли 'WM_PAINT' лучшим выбором для расчета размера окна? Мне кажется опасным для меня, что вы делаете что-либо в обработчике краски, что может вызвать еще большую окраску. –
Перемещение окна внутри обработчика 'WM_PAINT' не похоже на идеальное решение. Не связано с вашей проблемой, но ORing [WS_OVERLAPPED] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms632600.aspx) ничего полезного не делает. – IInspectable
Хорошо, я могу его переместить, я обычно пишу консольную программу, а не GUI. Однако я думал, что с bRepaint = false он не должен вызывать больше рисования. –