Windows擴展屏開發總結

本文來自網易雲社區html

 

做者:梁敏大數據

1、多屏設置ui

 

  1. 在設置-系統-能夠點擊顯示器1和2,能夠進行單獨設置;.net

  2. 「使之成爲個人主顯示器」能夠設置當前顯示器是主屏;主屏的選擇會決定整個虛擬屏幕座標起點的位置。設計

  3. 多顯示器能夠設置擴展,複製和獨立展現。(獨立顯示是隻在顯示屏1 或者2上顯示)指針

 

    • 擴展  - 設計,辦公等場景。對於應用的意義則在於咱們能夠在兩個或多個顯示器上,分別打開不一樣的窗口,好比在一個顯示器上顯示網頁,另外一個顯示器上進行文檔編輯,在多任務應用時會很是方便。調試

    • 複製  - 會議、教學、商業展現。也就是說多屏顯示系統中的每一個顯示設備,所顯示的內容都是同樣的,這一特色使它適合用在商務以及教學場合,好比大學課堂上講課時或在會議上進行演示等。 - 設置完成後,和擴展模式中各顯示器能夠設置成各自的最佳分辨率不一樣,複製模式只能根據較低得分辨率進行設置,相似水桶效應:多屏顯示系統中最小分辨率的設備決定整個畫面的分辨率。因此在複製模式下,若是兩款顯示設備的分辨率不同,則具備較高分辨率的顯示設備,畫面的質量必然受到影響,這也是複製模式的一個侷限。orm

    • 獨立。htm

 

  1. 設置是否在多顯示器上顯示任務欄,如圖:                 blog

  • 是否在全部顯示器上顯示任務欄 

  • 全部任務欄

  • 主任務欄和打開了窗口的任務欄

  • 打開了窗口的任務欄

 

2、虛擬桌面座標

  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)

 

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在多屏開發時主要問題是:當用戶將主屏窗口移動到副屏後,須要記錄窗口所處屏幕的信息。點擊彈出菜單或者建立新窗口時,須要根據當前所處屏幕計算位置。

    已經在咱們代碼裏作了以下處理,開發時注意:

  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 模擬器 下載、編譯及調試

相關文章
相關標籤/搜索