不规则窗体移动

来源:互联网 发布:mysql数据库分页语句 编辑:程序博客网 时间:2024/05/20 20:18

方法1:

在ON_WM_NCHITTEST事件中直接伪造:点击在客户区域都伪造成点在标题栏处
LRESULT CxxxDlg::OnNcHitTest(CPoint point)
{
 // TODO: Add your message handler code here and/or call default
     UINT nHitTest =0;
     nHitTest= CDialogEx::OnNcHitTest(point);
     if (nHitTest == HTCLIENT)
    {
        nHitTest = HTCAPTION; // 关键是这一句
    }
    return nHitTest;
}

方法2:

使用ON_WM_LBUTTONDOWN和ON_WM_MOUSEMOVE事件

在左键按下,记住开始位置,在移动时设置窗体的位置

void CxxxDlg::OnNcLButtonDown(UINT nHitTest, CPoint point)

{

     m_TempPoint=point;
 
     CDialogEx::OnNcLButtonDown(nHitTest, point);

};

 

void CclockDlg::OnMouseMove(UINT nFlags, CPoint point)
{

    if (nFlags&MK_LBUTTON) //如果鼠标移动时左键是按下的。

    {

        CPoint ipoint;

        ::GetCursorPos(&ipoint); //得到当前光标位置。

         SetWindowPos(NULL, ipoint.x-m_TempPoint.x , ipoint.y-m_TempPoint.y, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE);//设置窗口新位置。

     
    }

}

 

 

方法3:

使用ON_WM_LBUTTONDOWN事件


void CxxxxDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
 // TODO: Add your message handler code here and/or call default
 ClientToScreen(&point);
 SendMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELONG(point.x,point.y));
 CDialogEx::OnLButtonDown(nFlags, point);
}