我想让鼠标左键抬起后,获取哪些条目被选中了,,但压根就没处理WM_LBUTTONUP消息....倒是在双击的时候处理了。我用SPT++发现继承控件的确是收到WM_LBUTTONUP消息了,但为什么没有进入到OnLButtonUP函数呢????

解决方案 »

  1.   

    你是不是在调试的时候切换窗口,或者是在WM_LBUTTONDOWN消息处理中调用SetCapture指向其他窗口,这样会引起失去鼠标捕获。
    楼主可以这样验证一下:
    如果接收不到WM_LBUTTONUP消息,那应当会接收到WM_CAPTURECHANGED消息,添加WM_CAPTURECHANGED消息处理函数试试.
      

  2.   

    通常情况下,一个窗口调用了SetCapture后,所有的鼠标消息都会发到这个窗口上,流程为:
    ButtonDOWN(SetCapture) -> Move -> Up(ReleaseCapture),似乎没有错误.
    然而,一个窗口会意外的失去焦点(比如在进入Move状态后,用户按了Alt+TAB切换了窗口的焦点),这个时候流程为:DOWN(SetCapture) -> Move ->Lose Capture ... (收不到Up消息)
      

  3.   

    我用的是 WM_LBUTTONDOWN, 没用过 up 的
      

  4.   


    我重载后,CListCtrl的父窗口和CListCtrl类本身都没有调用SetCapture。。但是现在却响应不了WM_LBUTTONUP消息。我应该如何使用SetCapture才能使CListCtrl接收并处理这个消息呢?
      

  5.   

    调试与运行可能出现不动的情况,你直接在OnLButtonUP这个响应函数中加一行弹出消息框的代码:AfxMessageBox("OnLButtonUP");然后直接运行,看是否有消息框弹出,这样可确定问题根源
      

  6.   

    因为WM_LBUTTONDOWN事件和NM_CLICK事件是同时发生的,只是后者要等到用户释放鼠标后才算完成,也就是释放鼠标的时候才执行NM_CLICK事件.
    WM_LBUTTONDOWN以后会产生NM_CLICK通知,如果有NM_CLICK通知,WM_LBUTTONUP就不会产生了,NM_CLICK是一个通知消息,它是由WM_LBUTTONDOWN产生的,是否产生WM_LBUTTONUP与NM_CLICK的返回值有关。你可以在NM_CLICK消息响应中PostMessage发送一个WM_LBUTTONUP消息,或者在WM_LBUTTONDOWN消息响应函数中注释掉CListView::OnLButtonDown();的调用
      

  7.   

    最好是用用OnClick(NM_CLICK)事件替换OnLButtondown(WM_LBUTTONDOWN)和OnLbuttonup(WM_LBUTTONUP).
      

  8.   

    对的,CListCtrl类自带了鼠标的响应消息处理机制
      

  9.   


    你的解释很详细。谢谢你。
    如果PostMessage WM_LBUTTONUP了,那么我的鼠标还没有弹起会不会就已经响应了UP消息?
    如果我注释掉DOWN的调用了,那么我就无法选中条目了。我现在是想在CListCtrl中多选,然后将高亮的条目全部SetCheck,CLICK只能选中一条。
      

  10.   

    如果PostMessage WM_LBUTTONUP了,那么我的鼠标还没有弹起会不会就已经响应了UP消息?
    =>不会,你可以测试一下,当释放鼠标的时候才会进入OnClick函数,所以你在它的最后PostMessage就好.我现在是想在CListCtrl中多选,然后将高亮的条目全部SetCheck,CLICK只能选中一条。
    =>只要取消clistctrl属性中的single selection单选属性,就可以实现按着Ctrl键来多选
      

  11.   

    继承CListCtrl类, 映射WM_LBUTTONDOWN,WM_LBUTTONUP这两个消息,注释掉CListCtrl::OnLButtonDown(nFlags, point);这个语句,就可以收到鼠标弹起的消息