MFC控制元件隨對話方塊大小改變而改變
這也是我專案中碰到的問題,要讓對話方塊中的控制元件隨著對話方塊大小的變化進行自動調整,一般的做法是在WM_SIZE的響應函式中對所有的控制元件用MoveWindow()或者SetWindowPos()設定其變化比例。
但是由於需要自己計算,並且還有各種系統引起的情況,比如WIN7裡有個選項“拖動時顯示視窗內容”,選中與不選中導致對話方塊內容顯示完全不一樣,選中時錯誤,不選正確,確實讓人頭大。
使用方法如下:
1.首先將EasySize.h拷貝到工程資料夾中,然後在stdafx.h中包含該標頭檔案:
#include "EasySize.h"(當然你也可以只放在要使用的類裡)
2.在對話方塊類宣告中新增DECLARE_EASYSIZE巨集:
class CEasySizeDemoDlg : public CDialog
{
DECLARE_EASYSIZE
...
3.在OnInitDialog()函式中新增INIT_EASYSIZE巨集(注意分號):
BOOL CEasySizeDemoDlg::OnInitDialog()
{
CDialog::OnInitDialog();
...
INIT_EASYSIZE;
return TRUE; // return TRUE unless you set the focus to a control
}
4.響應WM_SIZE訊息,在響應函式中新增UPDATE_EASYSIZE巨集(注意分號):
void CEasySizeDemoDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
}
5.如果需要限制對話方塊有一個最小尺寸,首先在資源檢視中為對話方塊新增上最大化最小化按鈕,然後Class Wizard中選擇Class Info標籤,在Message fileter下拉列表中選擇Window,然後再點選Message Maps標籤,就出現WM_SIZING訊息了,新增該訊息的響應函式:
void CEasySizeDemoDlg::OnSizing(UINT fwSide, LPRECT pRect)
{
CDialog::OnSizing(fwSide, pRect);
EASYSIZE_MINSIZE(XXX,YYY,fwSide,pRect);
}
XXX,YYY是你自己定義的數值。
6.新增控制元件佈局對映,放到訊息對映之後,基本格式如下:
BEGIN_EASYSIZE_MAP(class_name)
...
EASYSIZE(control,left,top,right,bottom,options)
...
END_EASYSIZE_MAP
class_name就是對話方塊類的類名
control是要設定的控制元件的ID
left、top、right、bottom分別指的是該控制元件左、上、右、下方的控制元件的ID,也可以為以下特殊值:
ES_BORDER:保持與邊框距離不變
ES_KEEPSIZE:保持大小不變
所放位置:
left -- 表示和right指定的控制元件右對齊
right -- 表示和left指定的控制元件左對齊
top -- 表示和bottom指定的控制元件上對齊
bottom -- 表示和top指定的控制元件下對齊
如EASYSIZE(IDC_MYICON2,ES_BORDER,ES_BORDER,IDC_TITLE,ES_KEEPSIZE,ES_HCENTER)
我們看紅色部分, 它是一個控制元件ID, 表示上(top)與控制元件ID為IDC_TITLE的控制元件對齊(保持距離).
options可指定為0,也可指定為以下值:
ES_HCENTER:保持寬度不變,水平位置在left和right指定的控制元件正中間
ES_VCENTER:保持高度不變,垂直位置在left和right指定的控制元件正中間
7.LAST BUT NOT LEAST,設定的時候是有先後順序,如果順序設得不對,產生的佈局完全不同的。