说明:
我有一窗体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)
谁帮我弄弄???

解决方案 »

  1.   

    你的意思是拖动A窗口中的子控件B,就能移动A窗口吗?
      

  2.   

    我有一点疑问,你能确定代码中的WM_LBUTTONDOWN,是响应的子控件B的?也可以理解成你拖动A窗口中,就能移动A窗口的子控件B。
    如果能确定的话,感觉WM_LBUTTONUP也能响应才对啊
      

  3.   

    没错,上面的代码的确实现了这个效果,就那么几行代码所以,既然在窗体A里能截获鼠标在窗体B按下的消息,那么,自然也能截获鼠标在B抬起的消息啊可是不行,获得不了呢,为什么呢?我把上面的代码加了两行,如下:
    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 )
    {
                 //这里也截获不到
    }为什么呢
      

  4.   

    因为你PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,lParam);
    就直接return TRUE返回了,你修改了消息处理的流程。你可以在PostMessage WM_NCLBUTTONDOWN以后,再手动发送一个WM_LBUTTONUP消息
      

  5.   

    WM_LBUTTONUP是一个客户区消息
    你通过NCLBUTTONDOWN实现了窗体移动
    但是也改变了消息结构
    鼠标认为自己在非客户区自然没有了WM_LBUTTONUP消息
      

  6.   

    搞这么复杂啊,本窗口移动,计算相对位置后,直接在OnWindowPosChanged将你想让其移动的窗口移动到对应的位置就可以了!
    如果一定要这么实现的话,同楼上的,发送DOWN消息后,你还要发送UP消息
      

  7.   


    通过NCLBUTTONDOWN实现的窗体移动没错,但是,当鼠标抬起后,但我觉得,系统还是会有鼠标的UP事件的,不然窗体那不成了一直移动的吗?该怎么做呢???
    其实我知道有别的办法可以实现这个东西,只是,实际问题很复杂,我只能用这种方式来实现。所以,我必须要截获鼠标抬起事件,可是现在截获不了呢。。
      

  8.   

    我测试过
    这个事件真的接不到了
    你可以看看能不能收到NCLBUTTONUP
      

  9.   

    NCLBUTTONUP是收不到,即使你直接添加处理WM_NCLBUTTONDOWN消息,也是收不到WM_NCLBUTTONUP消息的,WM_NCLBUTTONUP经测试有2中情况下可以收到
    1. 双击非客户区
    2. 在客户点击,在非客户区释放鼠标左键
      

  10.   

    那该怎么办呢???
    我必须要接受这个消息啊,不管是LBUTTONUP,还是NCLBUTTONUP,可是现在接不到了
    怎么改改能接收到呢?
      

  11.   

    我觉得应该在子窗口里面处理Up和Down消息,这样就好做多了
      

  12.   

    2个窗体是同一个程序中的么?
    如果是,直接子类化之,SetWindowLong把消息处理函数指向自己这里,处理完再交回去,如果不是自己程序,没试过,SetWindowLong处理时候要先获得权限什么的,搜索线程注入。
      

  13.   

    钩子我想到了,不过我不想用,因为如果用全局钩子的话,很多软件都会查
    。如果这种方式真的行不通,那另一种方式也可以。如下:
    检测到这样一个事件:“窗体 被拖动了,等拖动完毕了,鼠标撒开了,然后告诉我一个消息”
    想来想去,想到了OnMove,不过OnMove其实是窗体刚一移动了一丁点地方,就发送的消息,也就是说,我拖这窗体一直跑,我鼠标还没撒开呢,那边已经发送OnMove了。
    可是没有这样的消息啊