VC得到屏幕的當前分辨率方法(5種)

vc得到屏幕的當前分辨率方法:
1.Windows API調用
int width = GetSystemMetrics ( SM_CXSCREEN );
int height= GetSystemMetrics ( SM_CYSCREEN );
如果想動態自適應分辨率的變化,處理WM_DISPLAYCHANGE消息.
2.獲得分辨率
BOOL EnumDisplaySettings(
LPCTSTR lpszDeviceName, // display device
DWORD iModeNum, // graphics mode
LPDEVMODE lpDevMode // graphics mode settings
);

改變分辨率
LONG ChangeDisplaySettings(
LPDEVMODE lpDevMode, // graphics mode
DWORD dwflags // graphics mode options
);
3.用GetDeviceCaps

int GetDeviceCaps(
HDC hdc, // handle to the device context
int nIndex // index of capability to query
);

4.用GetDeviceCaps
HDC hdcScreen = GetDC( NULL );
int cx = GetDeviceCaps( hdcScreen, HORZRES );
int cy = GetDeviceCaps( hdcScreen, VERTRES );
DeleteObject( hdcScreen );
其中nIndex可以取:
HORZRES VERTRES 或
分別表示:
HORZRES :Width, in pixels, of the screen.
VERTRES :Height, in raster lines, of the screen.

也就是設備的分辨率了
5.得到桌面客戶區的大小
(1) 最簡單,使用API
RECT rc;
SystemParametersInfo(SPI_GETWORKAREA, 0, (PVOID) &rc, 0);
str.Format("%d*%d",rc.right-rc.left,rc.bottom-rc.top);
(2)間接計算得到:先用上面的3種方法得到這個屏幕的大小,再減去任務欄的大小(注意:要考慮任務欄是否隱藏的情況)
int cx = GetSystemMetrics(SM_CXSCREEN);
int cy = GetSystemMetrics(SM_CYSCREEN);

HDC hdcScreen = GetDC( NULL );
int cx = GetDeviceCaps( hdcScreen, HORZRES );
int cy = GetDeviceCaps( hdcScreen, VERTRES );
DeleteObject( hdcScreen );

任務欄:
CWnd* pTaskWnd = FindWindow( _T("Shell_TrayWnd"), NULL );
if( pTaskWnd ) pTaskWnd->ShowWindow( FALSE );
任務欄是否隱藏:
LONG lStyle = GetWindowLong( pTaskWnd->GetSafeHwnd(), GWL_STYLE );
if( lStyle & WS_VISIBLE )
{
//可見
}
else
{
//隱藏
}
/////////////////////////////////
VC獲取屏幕大小
int with= GetSystemMetrics(SM_CXFULLSCREEN);
int heigh= GetSystemMetrics(SM_CYFULLSCREEN);
通過上邊兩個函數獲取的是顯示屏幕的大小,及不包括任務欄等區域。
int cx = GetSystemMetrics( SM_CXSCREEN ); 
int cy = GetSystemMetrics( SM_CYSCREEN );
這兩個函數獲取的是真正屏幕的大小。
用前兩個函數獲取的大小可能是1024*687 而用下邊兩個獲取的就是1024*768
說明
返回與windows環境有關的信息
返回值
Long,取決於具體的常數索引
參數表
參數 類型及說明
nIndex Long,常數,指定欲獲取的信息;如下表所示
nIndex常數設置
常數定義 取得信息
SM_ARRANGE 設置windows如何排列最小化窗口的一個標誌。參考api32.txt中的ARW常數
SM_CLEANBOOT 指定啓動模式。0=普通模式;1=帶網絡支持的安全模式
SM_CMETRICS 可用系統環境的數量
SM_CMOUSEBUTTON 鼠標按鈕(按鍵)的數量。如沒有鼠標,就爲零
SM_CXBORDER, SM_CYBORDER 尺寸不可變邊框的大小
SM_CXCURSOR, SM_CYCURSOR 標準指針大小
SM_CXDLGFRAME, SM_CYDLGFRAME 對話框邊框的大小
SM_CXDOUBLECLK, SM_CYDOUBLECLK 雙擊區域的大小(參考註解)
SM_CXFRAME, SM_CYFRAME 尺寸可變邊框的大小(在win95和nt 4.0中使用SM_C?FIXEDFRAME)
SM_CXFULLSCREEN, SM_CYFULLSCREEN 最大化窗口客戶區的大小
SM_CXHSCROLL, SM_CYHSCROLL 水平滾動條上的箭頭大小
SM_CXHTHUMB, SM_CYHTHUMB 滾動塊在水平滾動條上的大小
SM_CXICON, SM_CYICON 標準圖標的大小
SM_CXICONSPACING, SM_CYICONSPACING 桌面圖標之間的間隔距離。在win95和nt 4.0中是指大圖標的間距
SM_CXMAXIMIZED, SM_CYMAXIMIZED 最大化窗口的默認尺寸
SM_CXMAXTRACK, SM_CYMAXTRACK 改變窗口大小時,最大的軌跡寬度
SM_CXMENUCHECK, SM_CYMENUCHECK 菜單複選號位圖的大小
SM_CXMENUSIZE, SM_CYMENUSIZE 菜單欄上的按鈕大小
SM_CXMIN, SM_CYMIN 窗口的最小尺寸
SM_CXMINIMIZED, SM_CYMINIMIZED 最小化的窗口必須填充進去的一個矩形小於或等於SM_C?ICONSPACING
SM_CXMINTRACK, SM_CYMINTRACK 窗口的最小軌跡寬度
SM_CXSCREEN, SM_CYSCREEN 屏幕大小
SM_CXSIZE, SM_CYSIZE 標題欄位圖的大小
SM_CXSIZEFRAME, SM_CYSIZEFRAME 具有WS_THICKFRAME樣式的窗口的大小
SM_CXSMICON, SM_CYSMICON 小圖標的大小
SM_CXSMSIZE, SM_CYSMSIZE 小標題按鈕的大小
SM_CXVSCROLL, SM_CYVSCROLL 垂直滾動條中的箭頭按鈕的大小
SM_CYCAPTION 窗口標題的高度
SM_CYKANJIWINDOW Kanji窗口的大小(Height of Kanji window)
SM_CYMENU 菜單高度
SM_CYSMCAPTION 小標題的高度
SM_CYVTHUMB 垂直滾動條上滾動塊的高度
SM_DBCSENABLED 如支持雙字節則爲TRUE
SM_DEBUG 如windows的調試版正在運行,則爲TRUE
SM_MENUDropALIGNMENT 如彈出式菜單對齊菜單欄項目的左側,則爲零
SM_MIDEASTENABLED 允許了希伯來和阿拉伯語
SM_MOUSEPRESENT 如安裝了鼠標則爲TRUE
SM_MOUSEWHEELPRESENT 如安裝了帶輪鼠標則爲TRUE;只適用於nt 4.0
SM_NETWORK 如安裝了網絡,則設置位0。其他位保留未用
SM_PENWINDOWS 如裝載了支持筆窗口的DLL,則表示筆窗口的句柄
SM_SECURE 如安裝了安全(保密)機制,則爲TRUE
SM_SHOWSOUNDS 強制視覺提示播放聲音
SM_SLOWMACHINE 系統速度太慢,但仍在運行中(System is too slow for effective use but is being run anyway)
SM_SWAPBUTTON 如左右鼠標鍵已經交換,則爲TRUE '注意這裏
註解
雙擊區域指定屏幕上一個特定的顯示區域,只有在這個區域內連續進行兩次鼠標單擊,纔有可能被當作雙擊事件處理
其他
常數 SM_ARRANGE, SM_CLEANBOOT, SM_CMETRICS, SM_C?MAXIMIZED, SM_C?MAXTRACK, SM_C?SIZEFRAME, SM_C?SMICON, SM_C?SMSIZE, SM_CYSMCAPTION,
SM_SECURE, SM_SHOWSOUNDS, and SM_SLOWMACHINE 未獲 NT 3.51 及更早版本的支持
轉載請說明出處:http://blog.csdn.net/mycaibo
發佈了41 篇原創文章 · 獲贊 13 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章