在进行WTL项目开发时,可能会遇到需要支持多显示器的情况。幸运的是,Don Kackman已经为提供了一套优秀的MFC包装类,用于Win32多显示器API。为了将这些类移植到WTL项目中,保留了大部分原始代码,并对其进行了必要的修改。
有三个主要的类:
借助这些类,可以很容易地为应用程序添加多监视器支持。下面是一个示例:
将"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的坐标现在也是有效的。