Win32 中的双/多显示器支持






4.11/5 (11投票s)
2004年7月30日
2分钟阅读

77863
如何在您的 Win32 程序中添加双/多显示器支持。
引言
当我为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免费获得。
历史
此代码的第一个版本。