如何限制窗体的移动范围
作用:
可以控制MessageBox()确认窗口只能在父窗口的范围内移动,不能移出父窗口的范围。
注意:始终要保证子窗口坐标不越界以及维持窗口尺寸大小
方法:重载消息WM_MOVING
//限制窗口的移动范围(不能在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); }
或者:
//限制窗口的移动范围(不能在WM_MOVE中实现) void CDelTaskDlg::OnMoving(UINT fwSide, LPRECT pRect) { // TODO: 在此处添加消息处理程序代码 CRect rectParent; GetParent()->GetWindowRect(&rectParent); CRect rectChild; GetClientRect(&rectChild); //pRect->left = min(pRect->left, rectParent.right - rectChild.Width()); pRect->left = max(pRect->left, rectParent.left); pRect->right = pRect->left + rectChild.Width(); //pRect->top = min(pRect->top, rectParent.bottom - rectChild.Height()); 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); }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。