mfc对话框拖动

转载自:http://hi.baidu.com/bin545/item/757adb0e0febe210addc70dd

如果应用程序自己绘制的界面没有标题栏,那我们怎么来拖动程序呢?那么就可以添加下面消息:
  UINT CMainWindow::OnNcHitTest (CPoint point)
  {
      UINT nHitTest = CFrameWnd::OnNcHitTest (point);
      if (nHitTest == HTCLIENT) //如果是客户区
           {
               nHitTest = HTCAPTION; //则把它当成标题栏
           }
      return nHitTest;
  }
  经过上面处理后,如果用户拖动程序的客户区的话,系统会以为你拖动的是栏题栏,从而实现程序拖动

  实际应用中,还可以采用如下方式来实现,效果是相同的。
  UINT CPANDADlg::OnNcHitTest(CPoint point)
  {
    // TODO: Add your message handler code here and/or call default
    ScreenToClient(&point);

    CRect rc;
    GetClientRect(&rc);

     if(rc.PtInRect(point))
    {
            return HTCAPTION;
     }
    else
    {
      return CDialog::OnNcHitTest(point);
    }
  }

  程序说明:

  (1)CPANDADlg是定义的对话框类;

  (2)OnNcHitTest方法需要手动添加,添加的方法是:[View]-[ClassWizard],先选择[Class Info]选项卡,设置[Message filter:]为“Window”,然后,再回到[Message Maps]选项卡,给“CPANDADlg”类选中[Messages:]列表中的“WM_NCHTTEST”即可生成函数UINT CPANDADlg::OnNcHitTest(CPoint point) 。

OnNcHitTest
  CWnd::OnNcHitTest
  afx_msg UINT OnNcHitTest( CPoint point );
  返回值:下面列出的鼠标击中测试枚举值之一。
  · HTBORDER 在不具有可变大小边框的窗口的边框上。
  · HTBOTTOM 在窗口的水平边框的底部。
  · HTBOTTOMLEFT 在窗口边框的左下角。
  · HTBOTTOMRIGHT 在窗口边框的右下角。
  · HTCAPTION 在标题条中。
  · HTCLIENT 在客户区中。
  · HTERROR 在屏幕背景或窗口之间的分隔线上(与HTNOWHERE相同,除了Windows的DefWndProc函数产生一个系统响声以指明错误)。
  · HTGROWBOX 在尺寸框中。
  · HTHSCROLL 在水平滚动条上。
  · HTLEFT 在窗口的左边框上。
  · HTMAXBUTTON 在最大化按钮上。
  · HTMENU 在菜单区域。
  · HTMINBUTTON 在最小化按钮上。
  · HTNOWHERE 在屏幕背景或窗口之间的分隔线上。
  · HTREDUCE 在最小化按钮上。
  · HTRIGHT 在窗口的右边框上。
  · HTSIZE 在尺寸框中。(与HTGROWBOX相同)
  · HTSYSMENU 在控制菜单或子窗口的关闭按钮上。
  · HTTOP 在窗口水平边框的上方。
  · HTTOPLEFT 在窗口边框的左上角。
  · HTTOPRIGHT 在窗口边框的右上角。
  · HTTRANSPARENT 在一个被其它窗口覆盖的窗口中。
  · HTVSCROLL 在垂直滚动条中。
  · HTZOOM 在最大化按钮上。
  参数: point 包含了光标的x轴和y轴坐标。这些坐标总是用屏幕坐标给出的。
  说明: 每当鼠标移动时,框架就为包含光标(或者是用SetCapture成员函数捕获了鼠标输入的CWnd对象)的CWnd对象调用这个成员函数。
  注意框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现,则该实现将使用最初传递给消息的参数(而不是你提供给这个函数的参数)。

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