VC下双屏显示的实现

       主机上另外再连接一个监视器,这样主机就可以检测到两个显示器,设置显示器属性,将屏幕扩展到第二屏(采用扩展模式)。在VC编程时,可以检测到第二屏的信息(甚至多屏),比如屏的个数,各个屏的分辨率,各个屏的句柄,获得了这些信息后,就可以在第二屏上操作了,比如 画图之类。

       在编程中要用到相关的结构体和函数,这些都已经包装好,在 multimom.h 头文件中,该头文件VC自带有。在要用的的地方包含该头文件,注意在包含前面要加上一句宏定义:#define COMPILE_MULTIMON_STUBS

      几个重要的结构体和函数:

      EnumDisplayMonitors( )  

      该函数对当前用户系统中所包含的显示器进行枚举。应用程序就是通过与该函数交流得知,当前用户系统中
所拥有的显示器个数以及其名称。

      MonitorInfoex 和MonitorInfo  在这两个结构中保存着相应显示器的相关信息,如坐标、是否为主显示器等。

      GetMonitorInfo ( )           取得指定显示器的相关信息,如物理显示区大小等。
      MonitorFromPoint ( )      取得指定点所在的显示器句柄。
      MonitorFromRect ( )       取得指定矩形所在的显示器句柄。
      MonitorFromWindow( )  取得指定窗口所在的显示器句柄

      MonitorEnumProc( )   当应用程序调用 EnumDisplayMonitors ( ) 查询显示器个数时,系统自动为每一个显示器调用一次该函数。应用程序可以依此判断显示器的个数、位置及显示区域的大小等信息。

      编程实现,获得第二屏信息,在主屏上点击一按钮,在第二屏上显示一幅图像。

       在应用程序初始化时,调用EnumDisplayMonitors(NULL,NULL,MonitorEnumProc,0); ,该函数枚举显示器,得到显示器信息,方便以后调用。其中MonitorEnumProc,是一回调函数,这个回调函数是要自己写的,

 

[cpp]  view plain  copy
  1. /********************************************************* 
  2. 函数名:MonitorEnumProc() 
  3. 输入参数:HMONITOR hMonitor ---显示器句柄 
  4. HDC hdcMonitor  ----显示器DC句柄 
  5. LPRECT lprcMonitor----- 
  6. LPARAM dwData-----EnumDisplayMonitors传来的数据 
  7. 返回:bool 
  8. 功能:若返回为真,EnumDisplayMonitors继续枚举, 
  9. 若返回为假,EnumDisplayMonitors停止枚举,从而获得显示器信息 
  10. 将显示器个数保存在numScreen,分辨率信息保存在rect 
  11. **********************************************************/  
  12. BOOL CALLBACK MonitorEnumProc(HMONITOR hMonitor,  
  13.                               HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)  
  14. {  
  15.     static BOOL first = TRUE;   //标志  
  16.   
  17.     //保存显示器信息  
  18.     MONITORINFO monitorinfo;           
  19.     monitorinfo.cbSize = sizeof(MONITORINFO);  
  20.   
  21.     //获得显示器信息,将信息保存到monitorinfo中  
  22.     GetMonitorInfo(hMonitor, &monitorinfo);  
  23.   
  24.     //若检测到主屏  
  25.     if(monitorinfo.dwFlags == MONITORINFOF_PRIMARY)  
  26.     {  
  27.         if(first)  //第一次检测到主屏  
  28.         {  
  29.             first = FALSE;  
  30.             numScreen = 1;  
  31.   
  32.             //将显示器的分辨率信息保存到rect  
  33.             rect[0] = monitorinfo.rcMonitor;  
  34.             return TRUE;    
  35.   
  36.         }  
  37.         else //第二次检测到主屏,说明所有的监视器都已经检测了一遍,故可以停止检测了  
  38.         {  
  39.             first = TRUE;    //标志复位  
  40.             return FALSE;    //结束检测  
  41.         }  
  42.     }  
  43.   
  44.     rect[numScreen] = monitorinfo.rcMonitor;  
  45.     numScreen++;  
  46.     return TRUE;  
  47. }  
  48.   
  49. //创建对话框,通过MoveWindow 函数将对话框移动到第二屏上即可  
  50. if(numScreen == 2)  
  51. {  
  52.   
  53.     CSecondScr *pDlg = new CSecondScr;  
  54.   
  55.     pDlg->Create (IDD_DIALOG1,this);  
  56.     pDlg->ShowWindow (SW_SHOW);  
  57.     pDlg->MoveWindow (rect[1].left ,rect[1].top ,rect[1].Width (),rect[1].Height (),TRUE);  
  58.   
  59. }  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值