说明:
我有一窗体A,该窗体A创建了控件B
当我用鼠标拖动控件B时,窗体A也会跟着移动,实现代码如下:LRESULT CXXXWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if (message== WM_PARENTNOTIFY)
{
if( wParam== WM_LBUTTONDOWN )
{
int i= (lParam & 0xFFFF0000)>>16;
if (i<35 )
{//这里通过发送消息的方式,实现主窗体也跟着拖动
m_bDrag = TRUE;
PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,lParam); return TRUE;
}
} }
return CDialog::WindowProc(message, wParam, lParam);
}
以上代码的结果是:当我拖着控件B跑时,窗体A也会跟着移动。但是现在我的问题是:
在这个消息循环里,我截获不到鼠标按下后的抬起事件(WM_LBUTTONUP)或者(WM_NCLBUTTONUP)
(注意,不是在窗体A里的WM_LBUTTONUP事件哦,是在控件B里的WM_LBUTTONUP)
谁帮我弄弄???
我有一窗体A,该窗体A创建了控件B
当我用鼠标拖动控件B时,窗体A也会跟着移动,实现代码如下:LRESULT CXXXWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if (message== WM_PARENTNOTIFY)
{
if( wParam== WM_LBUTTONDOWN )
{
int i= (lParam & 0xFFFF0000)>>16;
if (i<35 )
{//这里通过发送消息的方式,实现主窗体也跟着拖动
m_bDrag = TRUE;
PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,lParam); return TRUE;
}
} }
return CDialog::WindowProc(message, wParam, lParam);
}
以上代码的结果是:当我拖着控件B跑时,窗体A也会跟着移动。但是现在我的问题是:
在这个消息循环里,我截获不到鼠标按下后的抬起事件(WM_LBUTTONUP)或者(WM_NCLBUTTONUP)
(注意,不是在窗体A里的WM_LBUTTONUP事件哦,是在控件B里的WM_LBUTTONUP)
谁帮我弄弄???
如果能确定的话,感觉WM_LBUTTONUP也能响应才对啊
if( wParam== WM_LBUTTONDOWN )
{
int i= (lParam & 0xFFFF0000)>>16;
if (i<35 )
{
m_bDrag = TRUE;
PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,lParam); return TRUE;
}
}
//以下两个if,是新加的,可是执行不到,也就代表截获不了
if ( wParam == WM_LBUTTONUP )
{
//这里截获不到
}
if ( wParam == WM_NCLBUTTONUP )
{
//这里也截获不到
}为什么呢
就直接return TRUE返回了,你修改了消息处理的流程。你可以在PostMessage WM_NCLBUTTONDOWN以后,再手动发送一个WM_LBUTTONUP消息
你通过NCLBUTTONDOWN实现了窗体移动
但是也改变了消息结构
鼠标认为自己在非客户区自然没有了WM_LBUTTONUP消息
如果一定要这么实现的话,同楼上的,发送DOWN消息后,你还要发送UP消息
通过NCLBUTTONDOWN实现的窗体移动没错,但是,当鼠标抬起后,但我觉得,系统还是会有鼠标的UP事件的,不然窗体那不成了一直移动的吗?该怎么做呢???
其实我知道有别的办法可以实现这个东西,只是,实际问题很复杂,我只能用这种方式来实现。所以,我必须要截获鼠标抬起事件,可是现在截获不了呢。。
这个事件真的接不到了
你可以看看能不能收到NCLBUTTONUP
1. 双击非客户区
2. 在客户点击,在非客户区释放鼠标左键
我必须要接受这个消息啊,不管是LBUTTONUP,还是NCLBUTTONUP,可是现在接不到了
怎么改改能接收到呢?
如果是,直接子类化之,SetWindowLong把消息处理函数指向自己这里,处理完再交回去,如果不是自己程序,没试过,SetWindowLong处理时候要先获得权限什么的,搜索线程注入。
。如果这种方式真的行不通,那另一种方式也可以。如下:
检测到这样一个事件:“窗体 被拖动了,等拖动完毕了,鼠标撒开了,然后告诉我一个消息”想来想去,想到了OnMove,不过OnMove其实是窗体刚一移动了一丁点地方,就发送的消息,也就是说,我拖这窗体一直跑,我鼠标还没撒开呢,那边已经发送OnMove了。
可是没有这样的消息啊