你曾今是否对花很多时间在基础 GUI上而不是关注确实的内容感到恼火?就拿一个可变的对话框或属性页来说吧,你必须对它上面每一个控件去code,告诉当某些控件大小发生改变时,他们应该如何去改变。现在我知道我不是第一个对可变对话框(ResizableDialog)给出解决策的人,但是本文是我一个方法。
基本上来说,所有你想要设计的对话框可以通过资源编辑器(不要忘记对话框属性设置大小可变)来实现, 然后你可以通过定义一个简单的宏来实现当对话框大小改变时去定义控件的动作。
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 }
UPDATE_EASYSIZE
:
void CEasySizeDemoDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); UPDATE_EASYSIZE; }
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)
BEGIN_EASYSIZE_MAP(class_name) ... EASYSIZE(control,left,top,right,bottom,options) ... END_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(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