首先放一下参考的链接。。
http://blog.sina.com.cn/s/blog_4b5039210100dzkd.html
http://bbs.csdn.NET/topics/350153879
http://blog.csdn.Net/liuy_yy/article/details/7219616
以上第一篇文章博主的方法虽然可以实现控件按比例跟随窗口变大变小,但问题来了。。
button控件我们不需要他变大啊(变大要丑死),而编辑框控件(Edit Control)到边角的距离应该保持不变。
所以必须换一种方法。。
第二篇文章是一个帖子,里面说到可以用MoveWindow/SetWindowPos自己调整按钮的位置或者大小。
操作方式类似于第一篇文章博主的做法
现在Dlg上面拖进来一个Edit Control ,命名为IDC_EDIT1。
我们在OnInitDialog()函数中获取对话框创建时的大小:GetClientRect(&m_rect);
PS: 消息响应函数的添加方法可参考文章末尾
void CTestDlg::OnSize(UINT nType, int cx, intcy)
{
归根结底的思路就是:用旧的坐标,通过数学计算得到新的坐标。
上面那个示例的运行结果,确定取消按钮是不会动的。。
如果想要让他们也动,需要重新修改坐标那块的代码。
累。。。
老师告诉我们,如果有一个功能实现不了,那肯定是你不知道,不是人家实现不了。
肯定会有更简单的方法。。
于是找到了这个东西 easysize
使用方法很简单。
1、在stdafx.h中引用EasySize.h头文件(同时将EasySize.h放到你的程序目录中)
2、在类定义中添加DECLARE_EASYSIZE
- <pre name="code" class="html">class CEasySizeDemoDlg : public CDialog
- {
- DECLARE_EASYSIZE //(此处没有分号)
- ``````
- };
<pre name="code" class="html">class CEasySizeDemoDlg : public CDialog
{
DECLARE_EASYSIZE //(此处没有分号)
``````
};
3、增加OnInitDialog处理函数,将INIT_EASYSIZE放到函数尾处。
- <pre name="code" class="cpp">BOOL CEasySizeDemoDlg::OnInitDialog()
- {
- `````
- INIT_EASYSIZE;
- return TRUE;
- }
<pre name="code" class="cpp">BOOL CEasySizeDemoDlg::OnInitDialog()
{
`````
INIT_EASYSIZE;
return TRUE;
}
4、增加OnSize函数(OnSize 是WM_SIZE的消息函数,不会添加的看最下面),添加宏UPDATE_EASYSIZE
- <pre name="code" class="cpp">void CEasySizeDemoDlg::OnSize(UINT nType, int cx, int cy)
- {
- CDialog::OnSize(nType, cx, cy);
- UPDATE_EASYSIZE;
- }
<pre name="code" class="cpp">void CEasySizeDemoDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
UPDATE_EASYSIZE;
}
5、可选(最小化)
6、创建EasySize映射(map),在你对话框实现文件的 xxxxxDlg.cpp中找到类似这样的代码
BEGIN_MESSAGE_MAP(CcameraDlg, CDialogEx) END_MESSAGE_MAP()
在下面添加
- BEGIN_EASYSIZE_MAP(CEasySizeDemoDlg)
- EASYSIZE(IDC_EDIT1, 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)
- END_EASYSIZE_MAP
BEGIN_EASYSIZE_MAP(CEasySizeDemoDlg)
EASYSIZE(IDC_EDIT1, 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)
END_EASYSIZE_MAP
通过在EasySize Map中使用EASYSIZE宏来指定当对话框改变时control相应的行为,宏定义格式如下:
EASYSIZE(control,left,top,right,bottom,options)
参数1(Control):需要重新定位的control ID.
参数2、3、4、5(left, top, right and bottom ):这四个参数可以设定的值有其它控件的ID、特定的值如如ES_BORDER、ES_KEEPSIZE。
ES_BORDER :代表控件与边框的距离保持不变。
ES_KEEPSIZE:代表控件的宽度和高度保持不变,left/right只能设置其中一个为ES_KEEPSIZE,同理,top/bottom亦然。
参数6(options):ES_HCENTER, ES_VCENTER and 0的组合。
ES_HCENTER :代表控件在left/right之间水平居中,此时这两个参数都不能设置为ES_KEEPSIZE,控件的宽度保持不变。
ES_VCENTER 同理(垂直方向)。
但是这样还是需要一个一个的设定,目前没有找到更简单的方法。。
===================================本教程结束============================================
关于如何添加消息映射函数
在这个Dlg上右键 ---类向导 ----
左边WM_XXXXXX 那一堆里面找到你想要的消息双击,然后点击右边的编辑代码,VS 会帮你做好前期工作的,代码复制进去就好了。。