【转载】MFC双屏

2022年 8月 15日 47点热度 0人点赞 0条评论

file

原文地址: https://blog.csdn.net/u012501459/article/details/22698467

主机上另外再连接一个监视器, 这样主机就可以检测到两个显示器, 设置显示器属性, 将屏幕扩展到第二屏 (采用扩展模式). 在 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;
}

创建对话框, 通过 MoveWindow 函数将对话框移动到第二屏上即可

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);
}

本文来自:https://blog.duhbb.com

本文链接地址:【转载】MFC双屏,英雄不问来路,转载请注明出处,谢谢。

有话想说:那就赶紧去给我留言吧。

rainbow

这个人很懒,什么都没留下

文章评论