65.9K
CodeProject 正在变化。 阅读更多。
Home

Win32 中的双/多显示器支持

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.11/5 (11投票s)

2004年7月30日

2分钟阅读

viewsIcon

77863

如何在您的 Win32 程序中添加双/多显示器支持。

Screenshot taken of GXTS on dual monitor system http://www.goheer.com

引言

当我为http://www.goheer.com编写 GXTS 屏幕保护程序时,遇到的一个问题是多显示器支持。我的目标是在连接到系统的全部显示器上显示相同的图像,无论显示器的数量是多少。

网上有很多关于多显示器的文章,但这些文章对我都没有帮助。有人使用`::GetSystemMetrics`,而另一些人则注册自建类来实现多显示器功能。这促使我去寻找一个简单的解决方案,因为我没有使用 MFC 或任何其他高级库。最终,我很惊讶地在 MSDN 库中找到了一个简单的解决方案。让我们来看看这个解决方案。

背景

Win32 API 的基础知识。

使用代码

通常,当您处理`WM_PAINT`事件时,您会这样做……捕获`WM_PAINT`并在该块中绘制您需要绘制的内容。

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

    // Draw your stuff here

    EndPaint(hWnd, &ps);
}
break;

好的,现在如果我们有 2 个或更多显示器,并且您想为每个显示器调用绘制过程,只需使用`EnumDisplayMonitors`函数并提供一个回调函数,您将在其中为每个显示器进行绘制。在本例中,我提供了回调函数`MyPaintEnumProc`。

case WM_PAINT:
{
    PAINTSTRUCT ps = {0};
    HDC hdcE = BeginPaint(hWnd, &ps );
    // call the function for enumerating all the monitors
    EnumDisplayMonitors(hdcE,NULL, MyPaintEnumProc, 0);

    EndPaint(hWnd, &ps);
}
break;

现在,让我们检查回调函数`MyPaintEnumProc`。通过提供`HDC`作为第一个参数,并将`NULL`作为第二个参数的`lprect`,系统将为每个显示器调用我们的回调函数。每次`hMonitor`将是该函数调用的显示器的句柄,`hdcl`将是该显示器的`HDC`,`lprcMonitor`将是显示器相交矩形。最后,在本例中,数据将为 null,因为我们将 0 作为最后一个参数提供给`EnumDisplayMonitors`。

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

    // Draw here now
    return 1;
}

记住在`MyPaintEnumProc`中返回 true 以枚举所有显示器。如果您返回 false,则枚举将在此处停止。

关注点

如果您认为屏幕保护程序“GXTS”的屏幕截图很酷,那么请尝试一下并告诉我您的评论。它可在http://www.goheer.com免费获得。

历史

此代码的第一个版本。

© . All rights reserved.