由于工程需要在多個顯示器上顯示不同類容,故查找了一些資料來滿足這個功能。在VC中分為三步來操作:檢測顯示器個數(shù);讀取屏幕分辨率和其他參數(shù);設(shè)置程序的顯示坐標(biāo)。 第一步:檢測屏幕個數(shù) 網(wǎng)上查找到的通用方法有兩個:EnumDisplayDevicess和GetSystemMetrics,下面分別介紹一下: A。EnumDisplayDevices(百度百科連接:http://baike.baidu.com/view/1080527.htm?fr=ala0_1,MSDN連接:http://msdn.microsoft.com/en-us/library/windows/desktop/dd162609(v=vs.85).aspx) 函數(shù)功能:該函數(shù)可得到系統(tǒng)中顯示設(shè)備的信息。 函數(shù)原型:BOOL EnumDisplayDevices (PVOID Unused, DWORD iDevNum, PDISPLAY_DEVICE lpDisplayDevice, DWORD dwFlags); 其中第一個參數(shù)和最后一個參數(shù)現(xiàn)在都還沒用到,主要是第二個參數(shù)和第三個,這里簡要介紹一下 iDevNum:指定感興趣的顯示設(shè)備的索引值,操作系統(tǒng)通過索引值確定每一個顯示設(shè)備。索引值是連續(xù)的整數(shù)。從0開始,例如:如果一個系統(tǒng)有三個顯示設(shè)備,那么它們的索引值為0、1、2。 lpdisplayDevice:DISPLAY_DEVICE結(jié)構(gòu)的指針,該結(jié)構(gòu)檢索由iDevNum指定的顯示設(shè)備的信息,在調(diào)用EnumDisplayDevices之前,必須以字節(jié)為單位把DISPLAY_DEVICE結(jié)構(gòu)中cb元素初始化為DISPLAY_DEVICE結(jié)構(gòu)的大小。 示例代碼:
其中iNumber中就為系統(tǒng)所帶顯示器的數(shù)量,網(wǎng)上很多地方都沒有紅色這一行,這樣檢測的結(jié)果并不準(zhǔn)確,我用的筆記本不管是不是有外接顯示器,檢測出的數(shù)字始終為5,查看了這篇日志(http://hi.baidu.com/lin65505578/item/ffa9c32598b14fc3a5275add)后添加了紅色語句后,運行結(jié)果就正常了。猜想EnumDisplayDevices只是檢測系統(tǒng)中存在的顯示設(shè)備,并不一定是當(dāng)前一定在用的設(shè)備。添加設(shè)置語句后,就可以檢測到正在使用的設(shè)備了。 B.int WINAPI GetSystemMetrics( __in int nIndex) (MSDN連接:http://msdn.microsoft.com/en-us/library/windows/desktop/ms724385(v=vs.85).aspx) 用于得到被定義的系統(tǒng)數(shù)據(jù)或者系統(tǒng)配置信息,百度百科上的資料較老,不全面。 只要設(shè)置nIndex為SM_CMONITORS即可,MSDN的解釋為:The number of display monitors on a desktop. 示例代碼: 第二步,讀取顯示器參數(shù)及其他參數(shù) 該過程使用前面的兩個API函數(shù):EnumDisplayDevices和EnumDisplaySettings。
iNumber為要查詢的顯示器編號,從0開始,主屏為0,然后1,2,3....一直下去。查詢?yōu)镋numDisplaySettings(),查詢的數(shù)據(jù)存儲在devMode中,常用的為dmPosition(為當(dāng)前顯示器的坐標(biāo)位置),dmPelsWidth,dmPelsHeight(為當(dāng)前顯示器的分辨率),其余根據(jù)自己需要參見MSDN(http://msdn.microsoft.com/en-us/library/windows/desktop/dd183565(v=vs.85).aspx). 第三步:設(shè)置當(dāng)前程序的顯示位置 在前兩步的基礎(chǔ)上,根據(jù)自己的需要來設(shè)置當(dāng)前程序的顯示坐標(biāo)(ps:如果對系統(tǒng)虛擬坐標(biāo)不了解的可以去查看一下相關(guān)資料) 示例代碼: |
|