mfc任意位置实现窗口拖动

1 系统标题栏窗口拖动的实现

 当鼠标在窗口内移动,点击或者释放时都会产生WM_NCHITTEST消息,响应函数OnNcHitTest会返回一个枚举值,mfc会根据这个枚举值进行相应的处理

 当返回值为HTCAPTION时,mfc会认为此时鼠标位于标题栏上,因而当鼠标按下并移动时就会执行拖动操作.


2 非系统标题栏窗口拖动的实现

 由1可知,只要我们重载OnNcHitTest函数,使鼠标在指定区域按下并拖动时OnNcHitTest函数返回HTCAPTION就可以实现窗口的拖动.


3 实现代码

 1)如果mfc程序是基于对话框的,在对话框类中添加OnNcHitTest消息处理函数,并添加如下代码

LRESULT Cxxx::OnNcHitTest(CPoint point) {
	CRect rc;
	GetClientRect(&rc);
	ClientToScreen(&rc);
	int x=point.x;
	int y=point.y;
	if (x>rc.left && x<rc.right-xxx && y>rc.top && y<rc.top+xxx) {
		return HTCAPTION;
	}


	return CFrameWnd::OnNcHitTest(point);
}

 其中的"xxx"表示任意的字符,在实际使用中需要根据情况进行修改(消息处理函数需要添加消息映射,建议使用向导来完成,以后相同情况不在进行说明)

 这样在指定区域按下鼠标左键并移动就可以实现窗口拖动了.


 2)如果mfc程序是基于文档/视图的,需要在主窗口类中进行与上面相同的操作,并在视图类中也添加OnNcHitTest消息处理函数,并添加如下代码

LRESULT Cxxx::OnNcHitTest(CPoint point) {
	CRect rc;
	GetClientRect(&rc);
	ClientToScreen(&rc);
	int x=point.x;
	int y=point.y;
	if (x>rc.left && x<rc.right-xxx &&
		y>rc.top && y<rc.top+xxx) {
		return HTTRANSPARENT;
	}

	return CView::OnNcHitTest(point);
}
 由于已经在视图类中的OnNcHitTest函数中进行了可拖动区域的判断,所以主窗口类中的OnNcHitTest函数不用在进行同样的判断,代码如下
LRESULT Cxxx::OnNcHitTest(CPoint point) {
	return HTCAPTION;
}

其他

 相关函数的作用,请查阅MSN文档

 关于OnNcHitTest函数的作用,可以查看此博文



以上内容属于个人理解,仅供参考,不保证正确. 如果发现错误或有建议请与我联系,谢谢.
email: linjieligc@qq.com
qq:914196158
程序设计交流群:250967270


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值