现在的位置: 首页 > 综合 > 正文

MFC一个解决自己发送WM_NCLBUTTONDOWN消息后收不到WM_ONLBUTTONUP的方法

2019年04月19日 ⁄ 综合 ⁄ 共 1027字 ⁄ 字号 评论关闭

MFC解决自己发送WM_NCLBUTTONDOWN消息收不到WM_LBUTTONUP的方法

    最近在做一个MFC拖动窗口的程序,在网上搜到了一个方法,在OnLButtonDown里自己发送

PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x,point.y));

消息。这样一来确实能够在客户区移动窗口了,但是有一个问题:WM_LBUTTONUP消息被忽略了,写在OnLButtonUp里的内容根本没执行。在网上搜解决方法,要么是太复杂,要么没有很好的解决。最后自己试出了一个方法,经测试可行:

在OnNcLButtonDown函数里完成父类函数后自己发送一个WM_ONLBUTTONUP消息。

如下(CWnd应该换成你自己继承的父类,因为我直接从CWnd类继承过来 的,所以是CWnd):

1.处理左键按下消息函数:

afx_msg void OnLButtonDown(UINT nFlags, CPoint point)
{
	RedrawWindow();
	Invalidate();
	//支持拖动
	PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x,point.y));
	CWnd::OnLButtonDown(nFlags, point);
}

这样就发送了非客户区左键按下的消息WM_NCLBUTTONDOWN。

2.处理非客户区左键按下消息函数:

afx_msg void OnNcLButtonDown(UINT nHitTest, CPoint point)
{
	CWnd::OnNcLButtonDown(nHitTest,point);
	PostMessage(WM_LBUTTONUP, NULL, NULL);
}

PostMessage(WM_LBUTTONUP, NULL, NULL)这一句就是自己发送左键放开的消息WM_LBUTTONUP。

根据这个结果,本人猜测CWnd::OnNcLButtonDown可能是要一直执行到鼠标放开时才结束,WM_LBUTTONUP被忽略了。这导致我们收不到WM_LBUTTONUP消息,所以在其后自己发送WM_LBUTTONUP后就能收到WM_LBUTTONUP消息了。

注意:

这个方法鼠标左键按下事件是有一秒左右延迟的,当把窗口移动到其他窗口上或控件上,松开再单击时可能会单击到那些窗口或控件,大家若有好的方法解决可以发下言。



抱歉!评论已关闭.