Я пытаюсь адаптировать заставку, написанную на 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 ()?
Ответ на самом деле описан в документах MSDN для EnumDisplayMonitors. Когда вы передаете параметр HDC в EnumDisplayMonitors, то DC, который он передает функции обратного вызова, является подмножеством DC, который вы изначально передали с этими изменениями:
Обратите внимание, что в современных Windows (по крайней мере, начиная с Win8) вы никогда не увидите на практике разные цветовые форматы для оконных контроллеров, поскольку GDI всегда работает с 32-битным цветом.
Других решений пока нет …