本文来自网易云社区

作者:梁敏

一、多屏设置

  1. 在设置-系统-可以点击显示器1和2,可以进行单独设置;

  2. “使之成为我的主显示器”可以设置当前显示器是主屏;主屏的选择会决定整个虚拟屏幕坐标起点的位置。

  3. 多显示器可以设置扩展,复制和独立展示。(独立显示是只在显示屏1 或者2上显示)

  • 扩展  - 设计,办公等场景。对于应用的意义则在于我们可以在两个或多个显示器上,分别打开不同的窗口,比如在一个显示器上显示网页,另一个显示器上进行文档编辑,在多任务应用时会非常方便。

  • 复制  - 会议、教学、商业展示。也就是说多屏显示系统中的每个显示设备,所显示的内容都是一样的,这一特点使它适合用在商务以及教学场合,比如大学课堂上讲课时或在会议上进行演示等。 - 设置完成后,和扩展模式中各显示器可以设置成各自的最佳分辨率不同,复制模式只能根据较低得分辨率进行设置,类似水桶效应:多屏显示系统中最小分辨率的设备决定整个画面的分辨率。所以在复制模式下,如果两款显示设备的分辨率不一样,则具有较高分辨率的显示设备,画面的质量必然受到影响,这也是复制模式的一个局限。

  • 独立。

  1. 设置是否在多显示器上显示任务栏,如图:                

  • 是否在所有显示器上显示任务栏

  • 所有任务栏

  • 主任务栏和打开了窗口的任务栏

  • 打开了窗口的任务栏

二、虚拟桌面坐标

  1. 主屏幕(Primary Screen)和扩展屏幕

    • 主显示屏的左上角决定了虚拟桌面的起始坐标(0,0)。其他显示器的显示区域的坐标由他和主显示屏的相对位置决定。

    • 扩展屏幕有多个。

  1. 虚拟屏幕(Virtual Screen)

    • 主屏和扩展屏组成的整个屏幕,就是虚拟屏幕。主屏和扩展屏,并非整齐排列,扩展屏可以放在主屏四周任何地方,但要相邻。

    • 虚拟桌面中的坐标是连续的,因此显示器2的坐标是主显示器1的显示区域的继续。例如如下显示器1分辨率1680x1050,显示器2分辨率1440x900,显示器2位于主显示器的正右方,则第二个显示区域的坐标是从(1680,0)到(3119,899)。                    

如果设置显示器2是主屏,显示器2的坐标是(0,0)->(1439,899),显示器1的坐标(-1679,1049)

三、系统相关API

Microsoft为支持多显示器模式提供了一些新的API调用,下面具体介绍它们的功能:

1.HMONITOR MonitorFromPoint(POINT pt,DWORD dwFlags)

MonitorFromPoint返回包含特定点(pt)的一个显示器句柄。如果pt不属于任何一个显示器,返回的显示器句柄由dwFlags标志决定:

MONITOR_DEFAULTTONULL时返回NULL;

MONITOR_DEFAULTTOPRIMARY时返回代表主显示器的HMONITOR句柄;

MONITOR_DEFAULTTONEAREST时返回最靠近pt点的显示器的HMONITOR句柄。

2.HMONITOR MonitorFromRect(LPCRECT lprc,DWORD dwFlags)

MonitorFromRect返回包含lprc代表的矩形的显示器句柄;如果包含此矩形的显示区域不止一个,则返回包含矩形最大部分的显示器句柄;如果矩形不属于任何一个显示区域,返回的句柄由dwFlags决定,规则与MonitorFromPoint相同。

3. HMONITOR MonitorFromWindow(HWND hwnd,DWORD dwFlags)

与MonitorFromRect类似,但输入是一个代表窗口的句柄hwnd而不是指向矩形的指针。

4.BOOL GetMonitorInfo(HMONITOR hMonitor,LPMONITORINFO lpmi)

GetMonitorInfo返回由hMonitor代表的显示器的有关信息,这些信息存储在指向MONITORINFO结构的指针——lpmi中。这些信息包括用RECT结构表示的显示器的显示区域的大小(如果这个显示器不是主显示器,RECT的坐标可能为负数),以及用RECT结构表示的显示器的工作区域的大小,工作区域是显示区域中除去系统任务栏和应用程序快捷方式栏所剩下的区域,还能够判断此显示器是否为主显示器,并返回一个标志。

5.GetSystemMetrics

获取坐标的时候用VIRTUALSCREEN参数

GetSystemMetrics(SM_CXVIRTUALSCREEN);//虚拟桌面宽度

GetSystemMetrics(SM_CYVIRTUALSCREEN);//虚拟桌面高度

GetSystemMetrics(SM_XVIRTUALSCREEN );//虚拟桌面左上角X坐标

GetSystemMetrics(SM_YVIRTUALSCREEN );//虚拟桌面左上角Y坐标

特别注意的是,多显示器的时候,SM_XVIRTUALSCREEN和SM_YVIRTUALSCREEN是可以为负值的。所以多显示器处理时,边界不要以为是(0,0)->(cx,cy)。多显示器的坐标是以主屏幕的左上角为(0,0)。 使用SM_CXSCREEN,SM_CYSCREEN获取只是主屏大小。

四、GUI扩展屏开发

GUI在多屏开发时主要问题是:当用户将主屏窗口移动到副屏后,需要记录窗口所处屏幕的信息。点击弹出菜单或者创建新窗口时,需要根据当前所处屏幕计算位置。

已经在我们代码里做了如下处理,开发时注意:

  1. 在用Window::CenterWindow显示新建窗口,如果希望窗口显示在和某窗口A在同一个显示器时,且窗口A不是新建窗口的父窗口,需要把该窗口A的句柄传入。例如我们的主窗口mainwnd,从主窗口新建窗口和主窗口在同一个显示器时,window->CenterWindow(mainwnd->GetHWND())。第二个参数wndCenter,代表是否要以指定窗口的居中显示。如果已经设置了父窗口,不需要这么设置,对于父窗口的。在CenterWindow在计算位置时会根据传入的窗口句柄所在显示器计算位置。SingletonShow这里也扩展了参数,可以传入窗口句柄。

void Window::CenterWindow(HWND hwndFrom, bool wndCenter/* = false*/)

eg:nim_ui::WindowsManager::SingletonShow<AboutForm>(AboutForm::kClassName, GetHWND());

  1. 在调用弹出的msgbox时,一定指定父窗口,这样弹出的msgbox就会和父窗口保持一致,不需其他处理。ShowMsgBox(m_hWnd, L"******", cb, L"", L"确定", L"");

  2. 在判断是否超出当前显示器边界的时候,这里要使用虚拟桌面的坐标来进行判断。

网易云大礼包:https://www.163yun.com/gift

本文来自网易云社区,经作者梁敏授权发布

相关文章:
【推荐】 SpringBoot入门(五)——自定义配置
【推荐】 多大规模的数据才值得用大数据的方式来处理?
【推荐】 Android 模拟器 下载、编译及调试

转载于:https://www.cnblogs.com/163yun/p/9583512.html

Windows扩展屏开发总结相关推荐

  1. Windows多屏开发小记

    这些天研究了下Windows系统下的多屏开发,这里做一个小分享. Windows系统下多屏模式原理 微软从Windows98后的操作系统就提供了多屏模式,并且在Windows7版本后微软对多屏模式从性 ...

  2. iPad做Windows扩展屏

    设备型号: Windows10 iPad air4 软件选择: twomon68太贵了,splash免费但是经常闪退,最后选择duet display,某宝1.7买下. 出现问题: 电脑之前安装过iT ...

  3. spacedesk将ipad作为windows电脑扩展屏

    一.官网下载spacedesk 官网下载:spacedesk,PC和ipad都要下载,然后安装 在ipad端输入PC端的ip地址,点击连接: 二.报错解决 如果报错:说明安装了其它投屏软件,特别是Sp ...

  4. 将windows的显示器作为linux的扩展屏

    这里写自定义目录标题 前言 Win Linux Requirements Build and install 运行 前言 测试的linux系统为ubuntu 18.04 测试的windows系统为wi ...

  5. windbg抓一个windows蓝屏分析

    前言 一直以来挺稳定,但还是小概率事件意外出现某machine突然蓝屏了.查看windows事件查看器提示计算机已经从检测错误后重新启动.检测错误: 0x0000009f (0x00000000000 ...

  6. windows桌面程序开发_每个软件开发人员都需要的6个Windows桌面实用程序

    windows桌面程序开发 大多数在Windows上工作的软件开发人员都有相当标准的工具集:代码编辑器或IDE: Git或其他版本控制系统: 消息传递客户端(Slack或其克隆之一),等等. 由于大多 ...

  7. Unity3D之扩展屏功能

    unity是由UnityTechnologies开发的一款游戏开发引擎,它的特点就是易用.跨平台.开发效率高,所以也成了目前为止手机游戏和虚拟现实领域中最受欢迎.市场占有率最多的开发工具. unity ...

  8. Windows phone 应用开发[12]-Pex 构建自动化白盒测试[下]

    本篇承接于上篇Windows phone 应用开发[11]-Pex 构建自动化白盒测试[上] .大概了解Pex作为自动化白盒测试工具工作方式.以及提出参数化单元测试的概念.为开发人员减少手动编写大量独 ...

  9. Windows上python开发--2安装django框架

    Windows上python开发--2安装django框架 分类: 服务器后台开发2014-05-17 21:22 2310人阅读 评论(2) 收藏 举报 python django 上一篇文章中讲了 ...

最新文章

  1. 关于HTML代码的转义
  2. HTML的标签描述13
  3. 技术向:一文读懂卷积神经网络CNN
  4. 【CV】图像分割二十年,盘点影响力最大的10篇论文
  5. 基于HLS流媒体协议的视频加密方案
  6. 面向对象的故事~数据底层操作告诉了我们接口,抽象类,继承与多态性的使用~续(TestBase继承ITest是多余的?)...
  7. 一道非常简单的签到题
  8. 分布式缓存服务是什么?
  9. jmobile学习之路 ----检测屏幕宽度
  10. 低照度图像修复方法总结
  11. linux 压缩与解压缩命令汇总
  12. 微信UnionID作用
  13. Vbs脚本编程简明教程之六
  14. h2ouve下载 insyde_H20UVE_100.00.9.2 Insyde H2OUVE (UEFI Variable Editor) - 下载 - 搜珍网
  15. 电梯轿厢内电动车自行车人数据集,VOC标签格式已标注
  16. axio.js封装和环境配置
  17. jsp注册页面java代码_JSP 实现登录注册功能-Fun言
  18. 2022-1-17第三章机器学习基础--网格搜索超参数优化、决策树、随机森林
  19. MPC5744P-CAN模块
  20. LeetCode报错:Line 1034:Char9

热门文章

  1. 手把手教你如何用Python模拟登录淘宝
  2. ES6解构赋值有这一篇就够了
  3. C语言也能写植物大战僵尸
  4. 机箱-网卡-声卡-显卡-显示器
  5. 【计算机网络】第一章:计算机网络导论(Part2:计算机网络性能指标)
  6. 一条短信息最长占多少byte?
  7. radware 负载后获取不到原始访问IP
  8. 在 Ubuntu 上安装 Codelite
  9. 锐捷telnet登录配置
  10. vue学习的第五天——小项目之天气预报