Сообщение WM_PAINT и EnumDisplayMonitors

Я пытаюсь адаптировать заставку, написанную на C ++, с WinAPI для работы с несколькими мониторами. я нашел Эта статья который предлагает переписать этот базовый обработчик WM_PAINT:

case WM_PAINT:
{
PAINTSTRUCT ps = {0};
HDC hdc = BeginPaint(hWnd, &ps );

DoDrawing(hdc, ps.rcPaint);

EndPaint(hWnd, &ps);
}
break;

void DoDrawing(HDC hDC, RECT rcDraw)
{
//Do actual drawing in 'hDC'
}

Примерно так, чтобы включить рисование для нескольких экранов:

case WM_PAINT:
{
PAINTSTRUCT ps = {0};
HDC hdcE = BeginPaint(hWnd, &ps );

EnumDisplayMonitors(hdcE,NULL, MyPaintEnumProc, 0);

EndPaint(hWnd, &ps);
}
break;

BOOL CALLBACK MyPaintEnumProc(
HMONITOR hMonitor,  // handle to display monitor
HDC hdc1,     // handle to monitor DC
LPRECT lprcMonitor, // monitor intersection rectangle
LPARAM data       // data
)
{
RECT rc = *lprcMonitor;
// you have the rect which has coordinates of the monitor

DoDrawing(hdc1, rc);

// Draw here now
return 1;
}

Но у меня есть вопрос: а как насчет специальной оптимизации / отсечения, которую BeginPaint () устанавливает в DC после обработки сообщения WM_PAINT? При таком подходе оно будет потеряно. Любая идея, как сохранить его через вызов EnumDisplayMonitors ()?

0

Решение

Ответ на самом деле описан в документах MSDN для EnumDisplayMonitors. Когда вы передаете параметр HDC в EnumDisplayMonitors, то DC, который он передает функции обратного вызова, является подмножеством DC, который вы изначально передали с этими изменениями:

  • Клип был дополнительно уменьшен, чтобы покрыть только пересечение исходного клипа с прямоугольником клипа монитора.
  • Цветовой формат DC предназначен для конкретного монитора, а не для «основного» монитора окна.

Обратите внимание, что в современных Windows (по крайней мере, начиная с Win8) вы никогда не увидите на практике разные цветовые форматы для оконных контроллеров, поскольку GDI всегда работает с 32-битным цветом.

0

Другие решения

Других решений пока нет …