多显示器屏幕保护程序开发指南

在开发屏幕保护程序时,一个常见的需求是支持多显示器环境。本文将介绍如何使用Microsoft Foundation Classes (MFC) 来实现这一功能。首先,需要了解Windows操作系统中多显示器的支持情况,然后通过API调用来获取和操作多个显示器。

Windows 98/2000引入了多显示器支持的API,使得开发者可以编写能够适应多个显示器的应用程序。这些API允许枚举系统中的所有显示器,并获取每个显示器的属性。在Windows 95/NT4上,虽然这些API不可用,但可以编写代码来兼容这些旧版本的操作系统。

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类依赖于一个假设,即监视器句柄不会改变。这个假设在经验上是安全的,但并不是一个保证。

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