WM_PAINT消息和EnumDisplayMonitors

时间:2012-09-17 09:05:49

标签: c++ winapi gdi multiple-monitors device-context

我正在尝试使用WinAPIs使用C ++编写的屏幕保护程序来适应多个监视器。我发现this article建议重写这个基本的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;
}

但我的问题是在处理WM_PAINT消息后,BeginPaint()在DC中设置的特殊优化/剪辑是什么?通过这种方法,它将会丢失。知道如何在EnumDisplayMonitors()调用中保留它吗?

1 个答案:

答案 0 :(得分:0)

答案实际上是在EnumDisplayMonitors的MSDN文档中描述的。将HDC参数传递给EnumDisplayMonitors时,它传递给回调函数的DC是您最初传入这些更改的DC的子集:

  • 剪辑进一步缩小为仅覆盖原始剪辑与显示器剪辑矩形的交叉点。
  • DC的颜色格式适用于特定的显示器,而不适用于" primary"监视窗口。

请注意,在现代Windows中(至少从Win8开始),由于GDI始终以32位颜色运行,因此您在实践中永远不会看到不同的颜色格式。