要让对话框中的控件随着对话框大小的变化进行自动调整,是一件很头疼的事情,需要在WM_SIZE的响应函数中对所有的控件用MoveWindow()或者SetWindowPos()设置其变化比例,极其繁琐。EasySize是一个很好解决方案,用一些宏封装了内部的实现机制,使用起来方便快捷。原文地址:http://www.codeproject.com/KB/dialog/easysize.aspx

使用方法如下:

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(280,250,fwSide,pRect);
    }

这样就把对话框的最小尺寸限制在(280, 250)上了

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指定的控件下对齐

options可指定为0,也可指定为以下值:
        ES_HCENTER:保持宽度不变,水平位置在left和right指定的控件正中间
        ES_VCENTER:保持高度不变,垂直位置在left和right指定的控件正中间