限制窗体的移动范围和缩放大小

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);   // 正方形	
}




你可能感兴趣的:(限制窗体的移动范围和缩放大小)