主机上另外再连接一个监视器,这样主机就可以检测到两个显示器,设置显示器属性,将屏幕扩展到第二屏(采用扩展模式)。在VC编程时,可以检测到第二屏的信息(甚至多屏),比如屏的个数,各个屏的分辨率,各个屏的句柄,获得了这些信息后,就可以在第二屏上操作了,比如画图之类。
在编程中要用到相关的结构体和函数,这些都已经包装好,在multimom.h头文件中,该头文件VC自带有。在要用的的地方包含该头文件,注意在包含前面要加上一句宏定义:
#define COMPILE_MULTIMON_STUBS
几个重要的结构体和函数
EnumDisplayMonitors( ) 该函数对当前用户系统中所包含的显示器进行枚举。应用程序就是通过与该函数交流得知,当前用户系统中
所拥有的显示器个数以及其名称。
MonitorInfoex 和MonitorInfo 。在这两个结构中保存着相应显示器的相关信息,如坐标、是否为主显示器等。
GetMonitorInfo ( ) 取得指定显示器的相关信息,如物理显示区大小等。
MonitorFromPoint ( ) 取得指定点所在的显示器句柄。
MonitorFromRect ( ) 取得指定矩形所在的显示器句柄。
MonitorFromWindow( ) 取得指定窗口所在的显示器句柄
MonitorEnumProc( ) 。当应用程序调用EnumDisplayMonitors ( )查询显示器个数时,系统自动为每一个显示器调用一次该函数。应用程序可以依此判断显示器的个数、位置及显示区域的大小等信息。
编程实现,获得第二屏信息,在主屏上点击一按钮,在第二屏上显示一幅图像。
在应用程序初始化时,调用EnumDisplayMonitors(NULL,NULL,MonitorEnumProc,0);,该函数枚举显示器,得到显示器信息,方便以后调用。其中MonitorEnumProc,是一回调函数,这个回调函数是要自己写的
/********************************************************* 函数名:MonitorEnumProc() 输入参数:HMONITOR hMonitor ---显示器句柄 HDC hdcMonitor ----显示器DC句柄 LPRECT lprcMonitor----- LPARAM dwData-----EnumDisplayMonitors传来的数据 返回:bool 功能:若返回为真,EnumDisplayMonitors继续枚举, 若返回为假,EnumDisplayMonitors停止枚举,从而获得显示器信息 将显示器个数保存在numScreen,分辨率信息保存在rect **********************************************************/ BOOL CALLBACK MonitorEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) { static BOOL first = TRUE; //标志 //保存显示器信息 MONITORINFO monitorinfo; monitorinfo.cbSize = sizeof(MONITORINFO); //获得显示器信息,将信息保存到monitorinfo中 GetMonitorInfo(hMonitor, &monitorinfo); //若检测到主屏 if(monitorinfo.dwFlags == MONITORINFOF_PRIMARY) { if(first) //第一次检测到主屏 { first = FALSE; numScreen = 1; //将显示器的分辨率信息保存到rect rect[0] = monitorinfo.rcMonitor; return TRUE; } else //第二次检测到主屏,说明所有的监视器都已经检测了一遍,故可以停止检测了 { first = TRUE; //标志复位 return FALSE; //结束检测 } } rect[numScreen] = monitorinfo.rcMonitor; numScreen++; return TRUE; }
if(numScreen == 2) { CSecondScr *pDlg = new CSecondScr; pDlg->Create (IDD_DIALOG1,this); pDlg->ShowWindow (SW_SHOW); pDlg->MoveWindow (rect[1].left ,rect[1].top ,rect[1].Width (),rect[1].Height (),TRUE); }