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)