MFC 无标题窗口拖动

说实话 MFC 提供的标题头不好看,而且修改麻烦。在实际使用过程中,我大多数情况下都是无标题对话框。
这样就会产生一些问题,比如
1、不能最小化或者点击任务栏图标不能最小化最大化
2、窗口不能拖动等问题
今天我们来解决第二个问题
能让窗口拖动有很多办法,有优点有缺点,根据自身程序决定了
1、当鼠标在窗口内移动或者点击都会产生WM_NCHITTEST消息,响应函数OnNcHitTest会返回一个枚举值,mfc会根据这个枚举值进行相应的处理。 当返回值为HTCAPTION时,MFC会认为此时鼠标位于标题栏上,因而当鼠标按下并移动时就会执行拖动操作。我们需要做的就是响应这个消息,然后根据自己的需要,返回HTCAPTION参数即可

LRESULT CRectProgressCtrl::OnNcHitTest(CPoint point)
{
    // TODO: Add your message handler code here and/or call default
    UINT nh=CDialog::OnNcHitTest(point);
    return ((nh==HTCLIENT)?HTCAPTION:nh);
}

这是一种最简单的方法、最基础的方法,以下方法都是从此方法变形而出

2、实际使用过程中我们可能限定窗口移动的范围,或者点击某一区域才能移动窗口

LRESULT CRectProgressCtrl::OnNcHitTest(CPoint point)
{
    // TODO: Add your message handler code here and/or call default
    CRect rc;
    GetClientRect(&rc);
    ClientToScreen(&rc);
    int x = point.x;
    int y = point.y;
    if (x>rc.left && x<rc.rigth-width && y>rc.top && y < rc.bottom-height)
    {
            return HTCAPTION;
    }
    else
    {
        return CDialog::OnNcHitTest(point);
    }

}

以上两种方法,OnNcHitTest会拦截一切鼠标消息包括ON_WM_LBUTTONDOWN,如果你的程序鼠标左击有消息需要处理,那就要很麻烦。
3、处理鼠标左击消息,用到ON_WM_NCLBUTTONDOWN或者ON_WM_LBUTTONDOWN等函数

void CRectProgressCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO: Add your message handler code here and/or call default
    SendMessage(WM_SYSCOMMAND,0xF012,0);
    CDialog::OnLButtonDown(nFlags, point);
}

需要注意的是SendMessage(WM_SYSCOMMAND,0xF012,0);
这跟第一个方法的效果相差不大,发送的消息说明的是发送SC_MOVE + HTCAPTION,所以这里简写成为0xF012。这种方法有一个好处就是不影响你的程序之前鼠标消息。当然你也可以使用ON_WM_NCLBUTTONDOWN,此消息是在OnNcHitTest消息之上。

参考
http://blog.csdn.net/liuyi1207164339/article/details/46729801
http://blog.csdn.net/aafengyuan/article/details/7565645
http://blog.csdn.net/luanwujian/article/details/9059861
http://blog.csdn.net/aafengyuan/article/details/7565645

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值