效果图:
Introduction
你曾今是否对花很多时间在基础 GUI上而不是关注确实的内容感到恼火?就拿一个可变的对话框或属性页来说吧,你必须对它上面每一个控件去code,告诉当某些控件大小发生改变时,他们应该如何去改变。现在我知道我不是第一个对可变对话框(ResizableDialog)给出解决策的人,但是本文是我一个方法。
Description
基本上来说,所有你想要设计的对话框可以通过资源编辑器(不要忘记对话框属性设置大小可变)来实现, 然后你可以通过定义一个简单的宏来实现当对话框大小改变时去定义控件的动作。
Usage
注意:对于对话框和属性页来说,所有的处理都是一样的1.#include
EasySize.h在stdafx.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的消息响应函数OnSize,添加
UPDATE_EASYSIZE
:
void CEasySizeDemoDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
UPDATE_EASYSIZE;
}
5.另外,如果你想设置对话框最小的size,添加WM_SIZEING的消息响应函数OnSizing,添加宏
EASYSIZE_MINSIZE
macro,如下:
void CEasySizeDemoDlg::OnSizing(UINT fwSide, LPRECT pRect)
{
CDialog::OnSizing(fwSide, pRect);
EASYSIZE_MINSIZE(280,250,fwSide,pRect);
}
//(in this example, 280 is the minimum width and 250 the
//minimum height we want our dialog to have)
6.现在对于你想要处理的控件创建"EasySize Map",它可以放在类实现的任何地方,形式如下:
BEGIN_EASYSIZE_MAP(class_name)
...
EASYSIZE(control,left,top,right,bottom,options)
...
END_EASYSIZE_MAP
下面是Demo应用程序的"EasySize Map":
...
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BEGIN_EASYSIZE_MAP(CEasySizeDemoDlg)
EASYSIZE(IDC_TITLE,ES_BORDER,ES_BORDER,
ES_BORDER,ES_KEEPSIZE,ES_HCENTER)
EASYSIZE(IDC_RADIO1,ES_BORDER,ES_BORDER,
ES_KEEPSIZE,ES_KEEPSIZE,0)
EASYSIZE(IDC_RADIO2,ES_BORDER,ES_BORDER,
ES_KEEPSIZE,ES_KEEPSIZE,0)
EASYSIZE(IDC_CONTENT,ES_BORDER,ES_BORDER,
ES_BORDER,ES_BORDER,0)
EASYSIZE(IDC_STATUSFRAME,ES_BORDER,ES_KEEPSIZE,
ES_BORDER,ES_BORDER,0)
EASYSIZE(IDC_STATUS,ES_BORDER,ES_KEEPSIZE,
ES_BORDER,ES_BORDER,0)
EASYSIZE(IDOK,ES_KEEPSIZE,ES_KEEPSIZE,
ES_BORDER,ES_BORDER,0)
EASYSIZE(IDCANCEL,ES_KEEPSIZE,ES_KEEPSIZE,
ES_BORDER,ES_BORDER,0)
EASYSIZE(IDC_MYICON1,ES_BORDER,IDC_RADIO2,IDC_CONTENT,
IDC_STATUSFRAME,ES_HCENTER|ES_VCENTER)
EASYSIZE(IDC_MYICON2,ES_BORDER,ES_BORDER,IDC_TITLE,
ES_KEEPSIZE,ES_HCENTER)
END_EASYSIZE_MAP
///
// CEasySizeDemoDlg message handlers
...
EASYSIZE Macro
EASYSIZE
macro是用来告诉控件当对话框大小改变后,自己该如何改变,形式如下:
EASYSIZE(control,left,top,right,bottom,options)
control
是控件ID;
left, top, right and bottom
可以是对话框中的控件也可以是ES_BORDER
和ES_KEEPSIZE
;
ES_BORDER
说明:该控件到对话框边界距离不变;
ES_KEEPSIZE
说明:该控件的宽或者高不变;
注意:left and right不能同时为
ES_KEEPSIZE
,top
and bottom
也不能同时为ES_KEEPSIZE
。
options
可以是ES_HCENTER
, ES_VCENTER
and 0;
0指不做任何处理
ES_HCENTER
指left和right之间水平居中
ES_VCENTER
指top和bottom之间垂直居中
EasySize.h(EASY-SIZE Macros)下载地址:http://download.csdn.net/detail/chenjintaoxp/4573851
文章代码easysize_demo.zip下载地址:http://download.csdn.net/detail/chenjintaoxp/4573855
原文翻译:http://www.codeproject.com/Articles/1657/EasySize-Dialog-resizing-in-no-time