1. 程式人生 > >VS2010 MFC 控制元件隨主框體變化而變化,功能完善

VS2010 MFC 控制元件隨主框體變化而變化,功能完善

轉載:https://www.codeproject.com/Articles/1657/EasySize-Dialog-resizing-in-no-time
之前,通過比例的方法來控制各個控制元件的大小隨主框體變化,這種方法在主框體連續變化多次後,會出現控制元件位置偏移的現象,到最後可能控制元件都流失不見了。
現找到一種新的方法,簡單好用。
EasySize是一種很好的解決控制元件隨主框體變化的方法,它使用了一些巨集封閉了內部的實現機制,使用起來簡單方便。
使用方法如下:
1、首先將EasySize.h拷貝到工程資料夾中,然後在stdafx.h中包含該標頭檔案:

#include "EasySize.h"

2、在主對話方塊類宣告中任意位置新增巨集DECLARE_EASYSIZE

class CEasySizeDemoDlg : public CDialog
{
DECLARE_EASYSIZE
...

3、在OnInitDialog 函式最後的位置新增巨集 INIT_EASYSIZE;這裡有個需要注意的地方,要等第6步BEGIN_MESSAGE_MAP和END_MESSAGE_MAP新增完成後,再編譯,否則會報錯的。

BOOL CEasySizeDemoDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
...    
    INIT_EASYSIZE;
    return TRUE; // 除非將焦點設定到控制元件,否則返回 TRUE
} 

4、建立WM_SIZE訊息,及其響就函式,並在其中新增巨集UPDATE_EASYSIZE;

void CEasySizeDemoDlg::OnSize(UINT nType, int cx, int cy) 
{
    CDialog::OnSize(nType, cx, cy);
    UPDATE_EASYSIZE;
} 

5、如果想要限制主對話方塊體的一個最小的尺寸,需要建立WM_SIZING訊息及其響應函式,並在其中新增判斷出EASYSIZE_MINSIZE

void CEasySizeDemoDlg::OnSizing(UINT fwSide, LPRECT pRect) 
{
    CDialog::OnSizing(fwSide, pRect);
    EASYSIZE_MINSIZE(280,250,fwSide,pRect); // 280是最小的寬度,250是最小的高度
}

6、現在,需要建立EasySize Map,建議放在訊息對映下面

BEGIN_MESSAGE_MAP(CTESTDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_SIZE()
	ON_WM_SIZING()
END_MESSAGE_MAP()

BEGIN_EASYSIZE_MAP(CTESTDlg)
	...
	EASYSIZE(control,left,top,right,bottom,options)
	...
END_EASYSIZE_MAP

7、巨集EASYSIZE是用來控制控制調整大小的巨集。

EASYSIZE(control,left,top,right,bottom,options)

control : 想調整大小的控制元件的ID
left、top、right、bottom : 指的是控制元件周圍的四個方位左、上、右、下,其值可以是其相對位置對應的控制元件ID,也可以是ES_BORDER 和ES_KEEPSIZE
options : 可以是ES_HCENTER和ES_VCENTER 的組合,也可以是0

8、舉例
編輯框隨主對話方塊大小變化而變化:

EASYSIZE(IDC_EDIT1,ES_BORDER,ES_BORDER,ES_BORDER,ES_BORDER,0)

Button1大小不變,並與右方的編輯框間距保持不變:

EASYSIZE(IDC_T1_BUTTON,ES_BORDER,ES_BORDER,IDC_EDIT1,ES_KEEPSIZE,0)
EASYSIZE(IDC_EDIT1,ES_BORDER,ES_BORDER,ES_BORDER,ES_BORDER,0)

標題大小不變並水平居中

EASYSIZE(IDC_TITLE_STATIC,ES_BORDER,ES_BORDER,ES_BORDER,ES_KEEPSIZE,ES_HCENTER)