1. 限制窗体的移动范围
作用:可以控制MessageBox()确认窗口只能在父窗口的范围内移动,不能移出父窗口的范围。
注意:始终要保证子窗口坐标不越界以及维持窗口尺寸大小
方法:重载消息WM_MOVING,不能在WM_MOVE中实现
例1:限制窗体只能在父窗口的单位内移动
//限制窗口的移动范围(不能在WM_MOVE中实现) void CDelTaskDlg::OnMoving(UINT fwSide, LPRECT pRect) { // TODO: 在此处添加消息处理程序代码 //获取主窗口屏幕坐标 //方法1: CRect rectParent; GetParent()->GetWindowRect(&rectParent); //方法2: //HWND hMain = AfxGetMainWnd()->GetSafeHwnd(); //::GetWindowRect(hMain, &rectParent); //方法3: //HWND hMain = AfxGetApp()->GetMainWnd()->GetSafeHwnd(); //::GetWindowRect(hMain, &rectParent); //当前窗口屏幕坐标 CRect rectChild; GetWindowRect(&rectChild); //保证左边框不越界 pRect->left = max(pRect->left, rectParent.left); pRect->left = min(pRect->left, rectParent.right - rectChild.Width()); //保证上边框不越界 pRect->top = max(pRect->top, rectParent.top); pRect->top = min(pRect->top, rectParent.bottom - rectChild.Height()); //保证右边框不越界 pRect->right = min(pRect->right, rectParent.right); pRect->right = max(pRect->right, rectParent.left + rectChild.Width()); //保证下边框不越界 pRect->bottom = min(pRect->bottom, rectParent.bottom); pRect->bottom = max(pRect->bottom, rectParent.top + rectChild.Height()); CDialogEx::OnMoving(fwSide, pRect); }
或者这样理解:
//控制顺序:先左再右,先上再下 void CDelTaskDlg::OnMoving(UINT fwSide, LPRECT pRect) { // TODO: 在此处添加消息处理程序代码 //获取主窗口屏幕坐标 CRect rectParent; GetParent()->GetWindowRect(&rectParent); //当前窗口屏幕坐标 CRect rectChild; GetClientRect(&rectChild); pRect->left = max(pRect->left, rectParent.left); //保证左边框不越界 pRect->right = pRect->left + rectChild.Width(); //保证窗口宽度,此时右边框可能越界,在后面再控制 pRect->top = max(pRect->top, rectParent.top); //保证上边框不越界 pRect->bottom = pRect->top + rectChild.Height(); //保证窗口高度,此时下边框可能越界,在后面再控制 pRect->right = min(pRect->right, rectParent.right); //保证右边框不越界, pRect->left = pRect->right - rectChild.Width(); //保证窗口宽度 pRect->bottom = min(pRect->bottom, rectParent.bottom); //保证下边框不越界 pRect->top = pRect->bottom - rectChild.Height(); //保证窗口高度 CDialogEx::OnMoving(fwSide, pRect); }
例2:限制窗口只能上下移动
void CMenuDlg::OnMoving(UINT fwSide, LPRECT pRect) { CDialogEx::OnMoving(fwSide, pRect); // TODO: 在此处添加消息处理程序代码 RECT rect; GetWindowRect(&rect); pRect->left=rect.left; pRect->right=rect.right; }
2. 控制窗体的缩放大小
方法:重载消息WM_SIZING
例1: 限制窗口只能改变右边的尺寸
void CMenuDlg::OnSizing(UINT fwSide, LPRECT pRect) { CDialogEx::OnSizing(fwSide, pRect); // TODO: 在此处添加消息处理程序代码 RECT rect; GetWindowRect(&rect); pRect->left=rect.left; pRect->bottom=rect.bottom; pRect->top=rect.top; }
例2:保证窗口始终是正方形
void CMenuDlg::OnSizing(UINT fwSide, LPRECT pRect) { CDialog::OnSizing(fwSide, pRect); // TODO: Add your message handler code here pRect->bottom=pRect->top+(pRect->right-pRect->left); // 正方形 }