1. 程式人生 > >MFC控制元件隨對話方塊大小改變而改變

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);
   

UPDATE_EASYSIZE;
}

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,設定的時候是有先後順序如果順序設得不對,產生的佈局完全不同的。