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消息了。
注意:
这个方法鼠标左键按下事件是有一秒左右延迟的,当把窗口移动到其他窗口上或控件上,松开再单击时可能会单击到那些窗口或控件,大家若有好的方法解决可以发下言。