Windows扩展屏开发总结

时间:2018-09-04 13:20:48   收藏:0   阅读:185

本文来自网易云社区

 

作者:梁敏

一、多屏设置

技术分享图片

 

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

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

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

 

 

  1. 设置是否在多显示器上显示任务栏,如图:                 技术分享图片

 

二、虚拟桌面坐标

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

  1. 虚拟屏幕(Virtual Screen)

 

 如果设置显示器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

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!