您的位置:首页 > 其它

MFC设置控件随着窗口自动拉伸变形

2014-06-28 09:47 120 查看
要让对话框中的控件随着对话框大小的变化进行自动调整,这个需要自己在WM_SIZE的响应函数中对所有的控件用MoveWindow()或者SetWindowPos()设置其变化比例,极其繁琐,使人头疼!!

推荐使用EasySize作为解决方案,它用一些宏封装了内部的实现机制,使用起来方便快捷!!很不错哦!

说个题外话:我用VS2012创建的基于对话框的工程,默认生成的对话框,无法用easysize使得控件随着对话框大小自动调整。不过,如果是自己新建的对话框是可以的,于是乎,我舍弃了项目自动生成的对话框,自己新建了一个作为主要的操作窗口,以便在项目中使用的是easysize实现的控件随着窗口自动拉伸变形、缩放。



下面进入主题,easysize的使用如下:

MFC怎么设置窗口和控件自动拉伸变形?

MFC如何使控件大小随着对话框大小自动调整 ?



1、设置对话框属性:Styles->Broder:Resizing

2、网上下载文件EasySize.h文件,并在stdafx.h中引用EasySize.h头文件(同时将EasySize.h放到你的程序目录中)

3、在对话框类定义的最前面添加DECLARE_EASYSIZE(注意:没有分号),如下

Class CEasySizeDemoDlg::public CDialog

{

DECLARE_EASYSIZE

...

}

题外话:在VS2012中不是CDialog,而是CDialogEx



4、在对话框的OnInitDialog消息函数中添加INIT_EASYSIZE,放到函数尾处。
OnInitDialog()
{
CDialog::OnInitDialog();
........
INIT_EASYSIZE;
return TRUE;
}
5、添加响应WM_SIZE消息,在生成的响应函数中添加UPDATA_EASYSIZE宏(注意有分号):
OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
UPDATE_EASYSIZE;
}
6、设置对话框最小尺寸(该项可以选择不设置)
如果需要限制对话框有一个最小尺寸,首先在资源视图中找到对话框,点选对话框——右键,属性,在属性添加上最大化最小化按钮,然后ClassWizard中选择Class Info标签,在Message fileter下拉列表中选择Window,然后再点击Message Maps标签,就出现WM_SIZING消息了,添加该消息的响应函数:
void CEasySizeDemoDlg::OnSizing(UINT fwSide, LPRECT pRect)

{

CDialog::OnSizing(fwSide, pRect);

EASYSIZE_MINSIZE(600, 400, fwSide, pRect);

}

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


7、在END_MESSAGE_MAP()的后面下一行添加:
BEGIN_EASYSIZE_MAP(对话框类名)
EASYSIZE(control,left,top,right,bottom,options)//这是使用格式,需要自己进行修改
EASYSIZE(.......)//为每一个需要调节的控件都进行对应的不同设置
END_EASYSIZE_MAP
这里是设置的难点,需要自己多测试找到对应控件适合的设置。
关于EASYSIZE(control, left, top, right, bottom, options)格式详解:
(1).control:这里填写需要调整大小的控件的ID;
(2).left,top,right,bottom:为控件左上角和右下角的坐标(亦可以看作控件的四条边),取值可以为:
ES_BORDER: 控件与对话框边界的距离;
ES_KEEPSIZE:控件水平/垂直方向上尺寸保持不变;
控件ID值:当前控件与指定控件之间的距离;
(3).Options:可以为ES_HCENTER, ES_VCENTER的结合,options可置0。
ES_HCENTER表示缩放后控件在指定位置内水平居中;
ES_VCENTER表示缩放后控件在指定位置内垂直居中;
代码举例例如:

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_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_MYICON2,ES_BORDER,ES_BORDER,IDC_TITLE,ES_KEEPSIZE,ES_HCENTER)
	EASYSIZE(IDC_CONTENT,IDC_TITLE,ES_BORDER,ES_BORDER,ES_BORDER,0)
	EASYSIZE(IDC_MIDFRAME,ES_BORDER,ES_BORDER,IDC_CONTENT,ES_BORDER,0)
	EASYSIZE(IDC_MIDRECT,ES_BORDER,ES_BORDER,IDC_CONTENT,ES_BORDER,0)
	EASYSIZE(IDC_MYICON1,IDC_MIDRECT,IDC_MIDRECT,IDC_MIDRECT,IDC_MIDRECT,ES_HCENTER|ES_VCENTER)
END_EASYSIZE_MAP


******************************************

以下再详细地解释一下,格式EASYSIZE(control,left,top,right,bottom,options)的用法:

宏EASYSIZE()的用法,其原型如下:

EASYSIZE(control,left,top,right,bottom,options)
该宏表示对ID值为control的控件实施缩放效果,缩放后的上下左右位置由control,left,top,right,bottom来确定,大小由option确定。
其中:control为对话框中的控件ID值,left,top,right,bottom四个参数为控件位置的坐标,其值可以选择ES_BOARD,ES_KEEPSIZE, 控件ID值三者之一。Options可以为ES_HCENTER, ES_VCENTER的结合,options可置0。
ES_BOARD表示控件与对话框边界(以下简称边界)的距离;
ES_KEEPSIZE表示控件水平/垂直方向上尺寸保持不变;
控件ID值表示当前控件与指定控件之间的距离;
ES_HCENTER表示缩放后控件在指定位置内水平居中;
ES_VCENTER表示缩放后控件在指定位置内垂直居中;
例如:
EASYSIZE(IDOK,ES_BORDER,ES_BORDER,ES_BORDER,ES_BORDER,0)
表示缩放后,值为IDOK的控件,距离边界上下左右位置保持不变,水平和垂直方向尺寸拉伸;
EASYSIZE(IDOK,ES_BORDER,ES_BORDER,ES_BORDER,ES_BORDER,ES_HCENTER)
表示缩放后,值为IDOK的控件,距离边界上下位置保持不变,垂直方向尺寸拉伸,水平居中;
EASYSIZE(IDOK,ES_BORDER,ES_BORDER,ES_BORDER,ES_BORDER,ES_HCENTER| ES_HCENTER)
表示缩放后,值为IDOK的控件,在对话框内垂直居中,水平居中;
EASYSIZE(IDOK,ES_BORDER,ES_KEEPSIZE,ES_KEEPSIZE,ES_BORDER,0)
表示缩放后,值为IDOK的控件,距离边界左、下方位置保持不变,同时保持控件尺寸;
EASYSIZE(IDOK,ES_BORDER,ES_KEEPSIZE, ES_BORDER,ES_BORDER,0)
表示缩放后,值为IDOK的控件,距离边界左、右、下方位置保持不变,水平方向尺寸拉伸,垂直方向尺寸不变;
EASYSIZE(IDOK,ES_BORDER,ES_BORDER,IDCANCEL,ES_BORDER,0)
表示缩放后,值为IDOK的控件,距离边界上下左位置保持不变,距离ID值为IDCANCEL的右方位置距离保持不变,水平和垂直方向尺寸拉伸;(当使用指定控件作为定位参数时候,确保指定控件的EASYSIZE在该宏前面)
********************************************
关于easysize的使用方法参考资料:
http://blog.163.com/weidao_xue/blog/static/204541046201221613010199/ easysize的使用方法 http://blog.csdn.net/headmaster110/article/details/5098619 EASY_SIZE:控件随窗口变化自由调整大小 http://blog.csdn.net/liuy_yy/article/details/7219616 Easysize 的使用 http://www.codeproject.com/Articles/1657/EasySize-Dialog-resizing-in-no-time easysize的英文原版官方教材
如果考虑自己手动写的朋友,可以参考一下下面的帖子:

http://blog.sina.com.cn/s/blog_4dbcd2730100wqme.html
http://blog.csdn.net/yangxiao_xiang/article/details/8498615
http://blog.163.com/scuqifuguang@126/blog/static/171370086201232741358711/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: