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)

猜你喜欢

转载自blog.csdn.net/ShiJian_ShaLou/article/details/84942293
今日推荐