http://my.oschina.net/u/131904/blog/39804
在mfc工程中控件或者窗口位置的調整是經常遇到的,特別是基於對話框的工程。位置的調整包括坐標、長度和寬度的變化,一般在窗口類的OnSize函數中實現。控件位置的調整涉及的函數有:GetWindowRect()、ScreenToClient()、GetClientRect()、MoveWindow()或SetWindowPos(),功能意義如下:
GetWindowRect():獲得窗口在屏幕上的矩形坐標,調整控件位置時必須首先獲得該屏幕坐標;
ScreenToClient():轉換屏幕坐標到客戶區坐標,如果為子窗口,轉換后坐標為相對於父窗口的坐標,若為獨立窗口,轉換后客戶區左上坐標為(0,0);調整子窗口時這一步也是必須的;
GetClientRect():獲得窗口客戶區坐標,左上坐標永遠為(0,0);
MoveWindow():調整控件到指定位置;
SetWindowPos():調整控件的位置,該函數使用更靈活,多用於只修改控件位置而大小不變或只修改大小而位置不變的情況:
控件位置調整涉及的參變量有:主窗口的cx、cy坐標、參考點坐標。相對於調整位置時調用的函數,變量稍許復雜些。cx、cy坐標為主窗口的寬和高,有OnSize的參數給出,為窗口控件調整提供了變化的范圍,所有的控件為了能夠正常顯示都不能超出這個范圍。其實在開發過程中較難和重要的是參考控件的選擇,其位置相對於主窗口來說必須好確定。常用的策略:
1. 選擇主窗口上位置不隨窗口大小變化的控件為參考;
2. 選擇主窗口上控件的寬或者高固定的控件;
3. 選擇與主窗口滿足固定坐標關系的控件 ;
4. 選擇主窗口上控件位置或者高寬容易確定的控件。
以上四種策略可在實際開發中作為參考!不管遇到什么的情況,一定要清楚:選擇一個
以用GetSystemMetrics函數可以獲取系統分辨率,但這只是其功能之一,GetSystemMetrics函數只有一個參數,稱之為「索引」,這個索引有75個標識符,通過設置不同的標識符就可以獲取系統分辨率、窗體顯示區域的寬度和高度、滾動條的寬度和高度。
為了使使GetSystemMetrics的功能,我們以獲取系統分辨率為例,並將其中的兩個值用TextOut輸出到窗體中。
第一步:用GetSystemMetrics獲取屏幕的寬度和高度
- int x, y;
- x = GetSystemMetrics(SM_CXSCREEN); //屏幕寬度
- y = GetSystemMetrics(SM_CYSCREEN); //屏幕高度
獲取窗體顯示區域大小
已我現在的了解,獲取窗體顯示區域大小有三種方法。
第一種方法:使用GetSystemMetrics函數
- GetSystemMetrics(SM_CXFULLSCREEN); //獲取最大化窗體的顯示區域寬度
- GetSystemMetrics(SM_CYFULLSCREEN); //獲取最大化窗體的顯示區域高度
下面是GetSystemMetrics函數參數nIndex的定義: |
SM_ARRANGE 返回是否預備最小化.
SM_CLEANBOOT 返回系統啟動方式:
SM_CMOUSEBUTTONS 返回值為系統支持的鼠標鍵數,返回0,則系統中沒有安裝鼠標。
SM_CXBORDER,
SM_CYBORDER 返回以相素值為單位的Windows窗口邊框的寬度和高度,如果Windows的為3D形態,則
等同於SM_CXEDGE參數
SM_CXCURSOR,
SM_CYCURSOR 返回以相素值為單位的標准光標的寬度和高度
SM_CXDLGFRAME,
SM_CYDLGFRAME 等同與SM_CXFIXEDFRAME and SM_CYFIXEDFRAME
SM_CXDOUBLECLK,
SM_CYDOUBLECLK 以相素值為單位的雙擊有效的矩形區域
SM_CXEDGE,SM_CYEDGE 以相素值為單位的3D邊框的寬度和高度
SM_CXFIXEDFRAME,
SM_CYFIXEDFRAME 圍繞具有標題但無法改變尺寸的窗口(通常是一些對話框)的邊框的厚度
SM_CXFRAME,SM_CYFRAME 等同於SM_CXSIZEFRAME and SM_CYSIZEFRAME
SM_CXFULLSCREEN,
SM_CYFULLSCREEN 全屏幕窗口的窗口區域的寬度和高度
SM_CXHSCROLL,
SM_CYHSCROLL 水平滾動條的高度和水平滾動條上箭頭的寬度
SM_CXHTHUMB 以相素為單位的水平滾動條上的滑動塊寬度
SM_CXICON,SM_CYICON 系統缺省的圖標的高度和寬度(一般為32*32)
SM_CXICONSPACING,
SM_CYICONSPACING 以大圖標方式查看Item時圖標之間的間距,這個距離總是大於等於
SM_CXICON and SM_CYICON.
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_CXMINTRACK,
SM_CYMINTRACK 最小跟蹤距離,當使用者拖動窗口移動距離小於這個值,窗口不會移動。
SM_CXSCREEN,
SM_CYSCREEN 以相素為單位計算的屏幕尺寸。
SM_CXSIZE,SM_CYSIZE 以相素計算的標題欄按鈕的尺寸
SM_CXSIZEFRAME,
SM_CYSIZEFRAME 圍繞可改變大小的窗口的邊框的厚度
SM_CXSMICON,
SM_CYSMICON 以相素計算的小圖標的尺寸,小圖標一般出現在窗口標題欄上。
M_CXVSCROLL,
SM_CYVSCROLL 以相素計算的垂直滾動條的寬度和垂直滾動條上箭頭的高度
SM_CYCAPTION 以相素計算的普通窗口標題的高度
SM_CYMENU 以相素計算的單個菜單條的高度
SM_CYSMCAPTION 以相素計算的窗口小標題欄的高度
SM_CYVTHUMB 以相素計算的垂直滾動條中滾動塊的高度
SM_DBCSENABLED 如果為TRUE或不為0的值表明系統安裝了雙字節版本的USER.EXE,為FALSE或0則不是。
SM_DEBUG 如果為TRUE或不為0的值表明系統安裝了debug版本的USER.EXE,為FALSE或0則不是。
SM_MENUDROPALIGNMENT 如果為TRUE或不為0的值下拉菜單是右對齊的否則是左對齊的。
SM_MOUSEPRESENT 如果為TRUE或不為0的值則安裝了鼠標,否則沒有安裝。
SM_MOUSEWHEELPRESENT 如果為TRUE或不為0的值則安裝了滾輪鼠標,否則沒有安裝。(Windows NT only)
SM_SWAPBUTTON 如果為TRUE或不為0的值則鼠標左右鍵交換,否則沒有。