Visual C++ 7.1Visual C++ 8.0Windows VistaVisual Studio .NET 2003Visual Studio 2005Windows 2000Windows XPMFC中级开发Visual StudioWindowsC++
在多显示器系统上重新定位窗口
如何在多显示器系统上重新定位窗口。
引言
在具有多个显示器的系统上,由于像
SystemParametersInfo( SPI_GETWORKAREA, 0, &rc, 0 );//only primary Monitor
这里有一个双显示器的可能设置:左侧 (1) 是标准显示器,右侧 (2) 是扩展显示器,例如用于不太重要的信息,如帮助、电子邮件或浏览。
背景
上周,我遇到了一个在具有多个显示器的计算机上恢复窗口的问题。我找了一些示例,但没有找到好的示例,所以我编写了一些代码来解决这个问题。并且,我想展示我的新知识并在此处发布它。
但还有其他可能的设置;例如,将右侧显示器设置为主要显示器可能会看起来很奇怪。这意味着左侧显示器的坐标具有负值。
任务栏
任务栏也需要一些空间,因此最好不要使用该区域来显示窗口。任务栏可以有不同的位置。这从标准位置 (1) 到三个不同的位置 (2)-(4) 进行了说明。
使用代码
我将所有有趣的代码打包到一个设计的类中,以便集中代码并易于使用。由于 #define COMPILE_MULTIMON_STUBS
,您需要注意如何使用该类。如果您发现更好的方法,请告诉我。
现在我编写了一个全局对象,因此您不需要额外的对象,并且如果您在项目中包含这些文件,该对象可用。
//Fetch informations
int cnt ) gMonitor.GetCount();
int iMonitor = gMonitor.GetPrimary();
//test for repositioning
CRect rc;
GetWindowRect( rc );
iMonitor = gMonitor.GetNearestDisplay( rc ); //also overloaded for point
if( !gMonitor.EnsureInMonitor( rc, iMonitor ) )
MoveWindow( rc );
关注点
这段代码可以帮助您在多显示器系统上获得更好的用户体验,因为如果窗口无法适应单个物理屏幕,它将被移动。
这变得非常棘手。当主显示器是右侧(或上方?)时,左侧(顶部)具有负值,并且调整大小需要额外的代码行。
另外,注意任务栏区域,这是另一个陷阱。
历史
- 初始发布:2007 年 7 月 24 日。
- 更新:2007 年 8 月 7 日:包含图片和工作区扩展。