本文来自网易云社区html
做者:梁敏大数据
1、多屏设置ui
-
在设置-系统-能够点击显示器1和2,能够进行单独设置;.net
-
“使之成为个人主显示器”能够设置当前显示器是主屏;主屏的选择会决定整个虚拟屏幕坐标起点的位置。设计
-
多显示器能够设置扩展,复制和独立展现。(独立显示是只在显示屏1 或者2上显示)指针
-
扩展 - 设计,办公等场景。对于应用的意义则在于咱们能够在两个或多个显示器上,分别打开不一样的窗口,好比在一个显示器上显示网页,另外一个显示器上进行文档编辑,在多任务应用时会很是方便。调试
-
复制 - 会议、教学、商业展现。也就是说多屏显示系统中的每一个显示设备,所显示的内容都是同样的,这一特色使它适合用在商务以及教学场合,好比大学课堂上讲课时或在会议上进行演示等。 - 设置完成后,和扩展模式中各显示器能够设置成各自的最佳分辨率不一样,复制模式只能根据较低得分辨率进行设置,相似水桶效应:多屏显示系统中最小分辨率的设备决定整个画面的分辨率。因此在复制模式下,若是两款显示设备的分辨率不同,则具备较高分辨率的显示设备,画面的质量必然受到影响,这也是复制模式的一个局限。orm
-
独立。htm
-
设置是否在多显示器上显示任务栏,如图:
blog
-
是否在全部显示器上显示任务栏
-
全部任务栏
-
主任务栏和打开了窗口的任务栏
-
打开了窗口的任务栏
2、虚拟桌面坐标
-
主屏幕(Primary Screen)和扩展屏幕
-
主显示屏的左上角决定了虚拟桌面的起始坐标(0,0)。其余显示器的显示区域的坐标由他和主显示屏的相对位置决定。
-
扩展屏幕有多个。
-
虚拟屏幕(Virtual Screen)
-
主屏和扩展屏组成的整个屏幕,就是虚拟屏幕。主屏和扩展屏,并不是整齐排列,扩展屏能够放在主屏四周任何地方,但要相邻。
-
虚拟桌面中的坐标是连续的,所以显示器2的坐标是主显示器1的显示区域的继续。例如以下显示器1分辨率1680x1050,显示器2分辨率1440x900,显示器2位于主显示器的正右方,则第二个显示区域的坐标是从(1680,0)到(3119,899)。
若是设置显示器2是主屏,显示器2的坐标是(0,0)->(1439,899),显示器1的坐标(-1679,1049)
3、系统相关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获取只是主屏大小。
4、GUI扩展屏开发
GUI在多屏开发时主要问题是:当用户将主屏窗口移动到副屏后,须要记录窗口所处屏幕的信息。点击弹出菜单或者建立新窗口时,须要根据当前所处屏幕计算位置。
已经在咱们代码里作了以下处理,开发时注意:
-
在用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());
-
在调用弹出的msgbox时,必定指定父窗口,这样弹出的msgbox就会和父窗口保持一致,不需其余处理。ShowMsgBox(m_hWnd, L"******", cb, L"", L"肯定", L"");
-
在判断是否超出当前显示器边界的时候,这里要使用虚拟桌面的坐标来进行判断。
网易云大礼包:https://www.163yun.com/gift
本文来自网易云社区,经做者梁敏受权发布
相关文章:
【推荐】 SpringBoot入门(五)——自定义配置
【推荐】 多大规模的数据才值得用大数据的方式来处理?
【推荐】 Android 模拟器 下载、编译及调试