参考:http://www.360doc.com/content/08/1210/09/799_2090143.shtml
参考:MSDN
Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源
调整窗口大小的一个关键是:根据调整方向的不同做出不同的响应。
例如从左侧调整,当调整到最小值时,不能继续进行调整,需要根据右边界还原位置。
0. 启用对话框为可调节对话框
在对话框 属性->外观-->Border,选择Resizing
1. 对话框的大小限制,预设好允许用户调整的大小范围,例如: 通常下限为我们认为需要确保窗口信息显示正常最小值
MinWidth = ;
MinHeight = ;
2. 响应大小调整的消息
OnSize函数为变动后处理,此时窗口大小已变更
CWnd::OnSize The framework calls this member function after the window's size has changed.
OnSizing响应用户的拖动,此时窗口尚未变更大小
CWnd::OnSizing The framework calls this member function to indicate that the user is resizing the rectangle.
3. 响应OnSizing详细说明
OnSizing(UINT fwSide, LPRECT pRect)
OnSizing响应用户的拖动,此时窗口尚未变更大小; 根据传入参数fwSide确定用户调整的方向, 根据传入传出参数pRect来确定调整后的大小。
3.1参数说明:
fwSide: 指示移动的是哪个边,取值(1-8) 分别有左边拖动,右边拖动,上边拖动,下边拖动,左上拖动,右上拖动,左下拖动,右下拖动
Left: 1 Right: 2 Top: 3 Bottom: 6 Left+Right: 3 Right+Top: 5 Left+Bottom: 7 Right+Bottom: 8
pRect: 拖动形成的矩形窗口,为指针变量,改动该结构会影响窗口的大小,从而影响调整的结果
可以自己定义四个宏来使用,具体MFC中是否有定义,我没有找到,所以自己定义的
#define MOVE_LEFT 1
#define MOVE_RIGHT 2
#define MOVE_TOP 3
#define MOVE_BOTTOM 6
3.2 在OnSizing中控制窗口的大小:使用传入传出参数pRect控制
a. 响应调整:根据用户调整的方向,当用户从左边挑宽度是,我们也从左边调,同理高度也如此
b. 大小限制:当移动的大小超出我们设置的限制时,调整传入的pRect指向的CRect值
// 当窗口宽度达到最小值时 if (fwSide == MOVE_RIGHT || fwSide == MOVE_RIGHT + MOVE_TOP || fwSide == MOVE_RIGHT + MOVE_BOTTOM) { pRect->right = pRect->left + MinWidth ; } else { pRect->left = pRect->right - MinWidth ; }
if (fwSide == MOVE_BOTTOM || fwSide == MOVE_BOTTOM + MOVE_LEFT || fwSide == MOVE_BOTTOM + MOVE_RIGHT) { pRect->bottom = pRect->top + MinHeight ; } else { pRect->top = pRect->bottom - MinHeight ; }
4. 在OnSize函数中根据需要调整各控件的大小
OnSize函数为变动后处理,此时窗口大小已变更,我们需要调整Dialog中的组件大小来适配窗口大小。例如:把edit窗口调宽一些
if ( 消息为调整消息 && 组件已构建)if (nType == SIZE_RESTORED && ::IsWindow(m_edit))
{
组件调整 GetDlgItem(IDC_EDIT)->MoveWindow(xxxx)
}
(因为第一个OnSize消息会在InitDialog之前,此时组件尚未构建,组件是不能调整的,所以判断条件里面加上这个IsWindow)