2015-08-10 2 views
0

У меня есть простая программа 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, но это не повлияло.

+1

Является ли 'WM_PAINT' лучшим выбором для расчета размера окна? Мне кажется опасным для меня, что вы делаете что-либо в обработчике краски, что может вызвать еще большую окраску. –

+1

Перемещение окна внутри обработчика 'WM_PAINT' не похоже на идеальное решение. Не связано с вашей проблемой, но ORing [WS_OVERLAPPED] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms632600.aspx) ничего полезного не делает. – IInspectable

+0

Хорошо, я могу его переместить, я обычно пишу консольную программу, а не GUI. Однако я думал, что с bRepaint = false он не должен вызывать больше рисования. –

ответ

0

Fixed это путем удаления WS_VISIBLE из моей команды CreateWindowEx, изменения размеров окна, а затем после изменения размеров окна под названием

ShowWindow(hWnd,SW_SHOW); 

Я также удалил окно изменения размера от WM_PAINT, однако это не исправить эту проблему.