从CButton派生了一个类CTestButton,加上了消息响应函数:CTestButton::OnLButtonUp也就是鼠标弹起的事件。当我点下鼠标,并移出按钮区域再松开时,CTestButton::OnLButtonUp是正常响应的。问题在下面的情况:当我把点下鼠标并移出按钮区域时,程序打开或关闭了一个非模态窗口(比如用快捷键或者其他的触发机制,不是用鼠标),再松开鼠标,这时CTestButton::OnLButtonUp就不响应了。请问有什么解决办法吗,感谢您的关注。

解决方案 »

  1.   

    补充一下,窗口不是简单的SW_SHOW与SW_HIDE,是涉及到了Create与Destroy
      

  2.   

    在LButtonDown的时候SetCapture
    LButtonUp的时候要ReleaseCapture
    用此来锁定鼠标的控制。
      

  3.   

    那你就鼠标点下之后开个计时器来GetCursorPos()
    如果鼠标移出Button区域就关窗口
      

  4.   


    这个不是我的本意哦,我是想捕获到LButtonUp这个事件发生的时候的。
      

  5.   


    这个方法不管用,貌似CButton本身就有处理Capture,我感觉就是因为涉及到对话框的创建与销毁导致了Capture出了问题。
      

  6.   

    鼠标up用 PreTranslateMessage(MSG* pMsg)来判断!
    点下,你还是用以前的方法,在弹起时,截取消息:
    if(pMsg->message == WM_LBUTTONUP)
      

  7.   

    当我把点下鼠标并移出按钮区域时,程序打开或关闭了一个非模态窗口(比如用快捷键或者其他的触发机制,不是用鼠标),
    此时触发WM_CANCELMODE事件,之后的鼠标消息跟这个按钮已经没有关系了。
      

  8.   


    谢谢你的回复,试了一下也不行,WM_LBUTTONUP这个消息貌似就没有产生过。
      

  9.   


    这个事件让我学到了新东西,感谢~我在CTestButton与各个窗口的WindowProc里断点WM_CANCELMODE消息,在点下鼠标并移出按钮区域时,用快捷键打开窗口,这个消息没有产生,是否是我理解有误?
      

  10.   

    不好意思,没说详细:如果被激活的窗口是进程外窗口时,发生WM_CAPTURECHANGED;但无论被激活的窗口是进程内进程外,都会发生WM_CAPTURECHANGED。
      

  11.   

    再次纠正-_- :如果被激活的窗口是进程外窗口时,发生WM_CANCELMODE;但无论被激活的窗口是进程内进程外,都会发生WM_CAPTURECHANGED。
      

  12.   


    WM_CAPTURECHANGED消息确实是事件的发生点,多谢了~