禁止对话框的拖动

 原理:

  在WM_HITTEST对应的消息处理函数OnNcHitTest中直接返回TRUE, 或者返回客户区的值HTCLIENT,欺骗系统我点的位置是客户区,客户区默认是不能拖动动话框的

例子:

UINT CMyDlg::OnNcHitTest(CPoint point)
{
  // TODO: Add your message handler code here and/or call default
   
  return HTCLIENT;

//return CDialog::OnNcHitTest(point);

}

以上做法是可以禁止拖动对话框,但是随之而来的是连最大化,最小化,关闭这些按钮都被忽略了,所有系统按钮菜单都用不了了。

解决办法,需要判断当前HITTEST的位置,如果是系统按钮,菜单,就返回正常值,否则一律返回HTCLIENT

LRESULT CMyDlg::OnNcHitTest(CPoint point)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值
 LRESULT lResult= CDialog::OnNcHitTest(point);
 BOOL bIngor = FALSE;
 switch(lResult)
 {
 case HTNOWHERE :  
  break;
  case HTCLIENT :
  break;
  case HTCAPTION : 
  break;
  case HTSYSMENU :
  bIngor = TRUE;
  break;
  case HTGROWBOX : 
  break;
  case HTMENU :  
  bIngor = TRUE;
  case HTHSCROLL :  
  break;
  case HTVSCROLL :  
  break;
  case HTMINBUTTON :  
  bIngor = TRUE;
  break;
  case HTMAXBUTTON :  
  bIngor = TRUE;
  break;
  case HTLEFT :  
  break;
  case HTRIGHT :  
  break;
  case HTTOP :  
  break;
  case HTTOPLEFT :  
  break;
  case HTTOPRIGHT :  
  break;
  case HTBOTTOM :  
  break;
  case HTBOTTOMLEFT :  
  break;
  case HTBOTTOMRIGHT :  
  break;
  case HTBORDER :  
  break;
  case HTOBJECT :  
  break;
  case HTCLOSE :  
  bIngor = TRUE;
  break;
  case HTHELP :  
  break;
 }
 if (!bIngor)
 {
  lResult = HTCLIENT;
 }
 return lResult;
  //return CDialog::OnNcHitTest(point);
 //}
}

你可能感兴趣的:(禁止对话框的拖动)