多显示器支持的WTL项目实现

在进行WTL项目开发时,可能会遇到需要支持多显示器的情况。幸运的是,Don Kackman已经为提供了一套优秀的MFC包装类,用于Win32多显示器API。为了将这些类移植到WTL项目中,保留了大部分原始代码,并对其进行了必要的修改。

使用代码

有三个主要的类:

  • CMonitor - 这是对HMONITOR句柄(由EnumDisplayMonitors函数返回)和GetMonitorInfo函数的包装。通过CMonitor,可以获取特定监视器的特性。
  • CMonitors - 表示当前连接到系统的监视器集合,并包装了EnumDisplayMonitors API函数。
  • CMonitorDC - 这是一个从CDC派生的类,代表特定监视器的设备上下文。虽然在示例中没有使用,但为了完整性保留了它。

借助这些类,可以很容易地为应用程序添加多监视器支持。下面是一个示例:

将"Monitor.h"和"Monitors.h"头文件添加到项目中。

如果需要保存窗口位置以便稍后恢复,那么在使用之前需要确保该位置仍然有效。在创建或显示窗口之前,添加以下代码:

CMonitors::MakeSureRectIsVisible(pRect);

以下是这个函数的实现。它的作用应该一目了然:

// 确保矩形可见 void CMonitors::MakeSureRectIsVisible(const LPRECT lprc) { // 检查矩形是否会在任何监视器上可见 if (!CMonitors::IsOnScreen(lprc)) { // 如果不是,矩形将被定位在主监视器的中心 CMonitor monitor = CMonitors::GetPrimaryMonitor(); monitor.CenterRectToMonitor(lprc); } }

如果需要在主监视器上居中窗口,添加以下代码:

CMonitor monitor = CMonitors::GetPrimaryMonitor(); monitor.CenterWindowToMonitor(this);

常见困惑点

请不要忘记,负坐标或大于SM_CXSCREEN、SM_CYSCREEN的坐标现在也是有效的。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485