在开发屏幕保护程序时,一个常见的需求是支持多显示器环境。本文将介绍如何使用Microsoft Foundation Classes (MFC) 来实现这一功能。首先,需要了解Windows操作系统中多显示器的支持情况,然后通过API调用来获取和操作多个显示器。
Windows 98/2000引入了多显示器支持的API,使得开发者可以编写能够适应多个显示器的应用程序。这些API允许枚举系统中的所有显示器,并获取每个显示器的属性。在Windows 95/NT4上,虽然这些API不可用,但可以编写代码来兼容这些旧版本的操作系统。
多显示器API的文档可以在David Campbell在1997年6月的MSJ杂志上发表的文章中找到。API本身简单直观,它提供了一些新的常量传递给GetSystemMetrics函数,以及一些方法来枚举当前连接到系统的显示器,并获取给定显示器的属性。
在MFC中,可以通过定义一些类来封装多显示器API。以下是一些基本的类和它们的功能:
CMonitors类代表当前连接到系统的显示器集合,并封装了EnumDisplayMonitors API函数。以下是CMonitors类的一些接口:
CMonitor GetMonitor(int index) const;
int GetCount() const;
static CMonitor GetNearestMonitor(const LPRECT lprc);
static CMonitor GetNearestMonitor(const POINT pt);
static CMonitor GetNearestMonitor(const CWnd* pWnd);
static BOOL IsOnScreen(const POINT pt);
static BOOL IsOnScreen(const CWnd* pWnd);
static BOOL IsOnScreen(const LPRECT lprc);
static void GetVirtualDesktopRect(LPRECT lprc);
static BOOL IsMonitor(const HMONITOR hMonitor);
static CMonitor GetPrimaryMonitor();
static BOOL AllMonitorsShareDisplayFormat();
static int GetMonitorCount();
CMonitor类是一个包装HMONITOR句柄(由EnumDisplayMonitors返回)和GetMonitorInfo函数的类。使用CMonitor,可以访问给定显示器的特性。以下是CMonitor类的一些接口:
void Attach(const HMONITOR hMonitor);
HMONITOR Detach();
void ClipRectToMonitor(LPRECT lprc, const BOOL UseWorkAreaRect = FALSE) const;
void CenterRectToMonitor(LPRECT lprc, const BOOL UseWorkAreaRect = FALSE) const;
void CenterWindowToMonitor(CWnd* const pWnd, const BOOL UseWorkAreaRect = FALSE) const;
HDC CreateDC() const;
void GetMonitorRect(LPRECT lprc) const;
void GetWorkAreaRect(LPRECT lprc) const;
void GetName(CString& string) const;
int GetBitsPerPixel() const;
BOOL IsOnMonitor(const POINT pt) const;
BOOL IsOnMonitor(const CWnd* pWnd) const;
BOOL IsOnMonitor(const LPRECT lprc) const;
BOOL IsPrimaryMonitor() const;
BOOL IsMonitor() const;
CMonitorDC是一个派生自CDC的类,代表特定于监视器的设备上下文。这个类目前还没有完全实现,但它似乎是库的一个逻辑部分。
CMonitor和CMonitors类依赖于一个假设,即监视器句柄不会改变。这个假设在经验上是安全的,但并不是一个保证。