MFC点击Dialog窗体可拖动的实现

MFC创建一个可通过鼠标点击客户区拖动窗口位置的方法

通过添加消息响应函数
afx_msg UINT OnNcHitTest(CPoint point);
添加宏
ON_WM_NCHITTEST()

然后, 定义OnNcHitTest的行为即可, OnNcHitTest的代码如下:

UINT CTimerDlg::OnNcHitTest(CPoint point)
{
CRect rect;
GetClientRect(rect);
ClientToScreen(rect);

if(rect.PtInRect(point))
return HTCAPTION;
return CDialog::OnNcHitTest(point);
}


首先, 发生WM_NCHITTEST消息的时候, 程序先取得客户区的窗口矩形, 这里用到GetClientRect方法得到, 由于GetClientRect取得的是相对于窗口坐标系统, 但OnNcHitTest的参数point却是相对于屏幕的坐标系统, 所以这里用到了ClientToScreen把取到的客户区矩形转成相对于屏幕的坐标, 然后用CRect类的PtInRect方法判断point是否落在这个矩形里面, 如果是, 则返回HTCAPTION(就相当于这次点击是点击标题栏), 所以, 就可以这样来拖动窗口了. 如果, OnNcHitTest直接返回HTCAPTION的话, 那么, 但用户点击非客户区的时候, 有些功能会失效, 比如点击系统的关闭按钮, 试一下就会发现这个按钮无效了; ok, 如果点击的是非客户端, 者直接返回CDialog::OnNcHitTest(point), 这就是按默认处理了.

以上的这个方法比较麻烦, 其实可以更简单一点, 只要先调用父类的OnNcHitTest(point), 取得返回值, 在判断是不是HTCLIENT, 如果是, 则返回HTCAPTION, 否则直接返回父类OnNcHitTest(point)的返回值就ok了, 修改后如下:

UINT CTimerDlg::OnNcHitTest(CPoint point)
{
UINT uRet = CDialog::OnNcHitTest(point);
if(HTCLIENT == uRet)
return HTCAPTION;
return uRet;
}


再简化一下, 就成这样子:

UINT CTimerDlg::OnNcHitTest(CPoint point)
{
UINT uRet = CDialog::OnNcHitTest(point);
return (HTCLIENT == uRet) ? HTCAPTION : uRet;
}
 
由于想收藏可是一直提示错误,就直接转载出来了!
转载自http://www.cppblog.com/jianc/archive/2012/05/11/174547.html

转载于:https://www.cnblogs.com/littlex/archive/2012/11/18/2776279.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值