一次点击只有WM_LBUTTONDOWN没有WM_LBUTTONUP,何解?

伏神 2011-01-18 01:41:52
我从clistctrl类派生了新类,打算分别处理一次鼠标点击中的WM_LBUTTONDOWN和WM_LBUTTONUP消息

结果意外的事情是,OnLButtonDown函数能进入,OnLButtonUp却没有进入

void CListCtrlEx::OnLButtonDown(UINT nFlags, CPoint point)
{
CListCtrl::OnLButtonDown(nFlags, point);
}

void CListCtrlEx::OnLButtonUp(UINT nFlags, CPoint point)
{
CListCtrl::OnLButtonUp(nFlags, point);
}

代码已经简化到上面的程度了,在OnLButtonUp中设断点同样没有断下

如果左键按下,不放开的同时,移动鼠标位置,再松开,ok,可以进入OnLButtonUp
如果双击左键,也能进入OnLButtonUp

难道说单击时候的WM_LBUTTONUP被windows吃掉了??

谁能告诉我解决方案??
...全文
1092 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
海贼王大妈 2012-06-30
  • 打赏
  • 举报
回复
今天我也遇到了这个问题,郁闷半天,发现处理NM_RCLICK消息就可以了
warroom 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tttyd 的回复:]
在Down点击事件中

C/C++ code
//// Capture all mouse messages
SetCapture ();

up事件中

C/C++ code
ReleaseCapture ();
[/Quote]


说明下:我在实现一个BUTTON时也遇到过LZ的类似问题。
不过,我是利用了这个方法,实现成功的。
伏神 2011-01-18
  • 打赏
  • 举报
回复
虽然没搞清楚WM_LBUTTONUP到底是怎么处理的,但是问题基本解决,总结一下
1.将基类的CListCtrl::OnLButtonDown(nFlags, point);注释掉可以响应WM_LBUTTONUP,但是会带来副作用,单击将不能选中列表中的项
2.在执行了OnLButtonDown后,确实会处理NM_CLICK消息,在此消息中添加代码可以满足我的需求,同时不会带来副作用
3.发现了VC9的一个bug,自动添加NM_CLICK响应函数的代码居然是错的 o(╯□╰)o

总算是把急用的代码搞定了,有空再慢慢分析WM_LBUTTONUP
结贴给分
Eleven 2011-01-18
  • 打赏
  • 举报
回复
void CListCtrlEx::OnLButtonDown(UINT nFlags, CPoint point)
{
// CListCtrl::OnLButtonDown(nFlags, point);
}
把基类的OnLButtonDown注释掉就可以相应WM_LBUTTONUP消息了
oyljerry 2011-01-18
  • 打赏
  • 举报
回复
可以自己在可能的消息中都打印日志出来
Wang471981125 2011-01-18
  • 打赏
  • 举报
回复
建议将CListCtrl::OnLButtonDown(nFlags, point);注释掉

测试WM_LBUTTONUP
伏神 2011-01-18
  • 打赏
  • 举报
回复
我发现左键松开的时候进入的是OnMouseMove
伏神 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 mayudong1 的回复:]
void CListCtrlEx::OnLButtonDown(UINT nFlags, CPoint point)
{
AfxMessageBox(_T("LButtonDown"));
CListCtrl::OnLButtonDown(nFlags, point);
}

void CListCtrlEx::OnLButtonUp(UINT nFlags, CPoint point……
[/Quote]

这样是不行的,而且这种测试messagebox应该会把消息阻塞,我都是用的OutputDebugString
wangbo56916860 2011-01-18
  • 打赏
  • 举报
回复
你不添加只是代表你不响应这段代码 不代表没有这个消息
伏神 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wangbo56916860 的回复:]
引用:
有的时候就获得不到WM_LBUTTONUP , 有什么办法让他一定有这个事件呢?

在OnLButtonDown后. WM_MOUSEMOVE事件下产生Drag.
但是OnLButtonDown()必须需要WM_LBUTTONUP
但是如果有了NM_CLICK,就得不到了。

NM_CLICK是一个通知消息,它是由WM_LBUTTONDOWN产生的。

是否产生W……
[/Quote]

我看一下是不是和NM_CLICK有关,但是我并没添加NM_CLICK处理的代码
wangbo56916860 2011-01-18
  • 打赏
  • 举报
回复
引用:
有的时候就获得不到WM_LBUTTONUP , 有什么办法让他一定有这个事件呢?

在OnLButtonDown后. WM_MOUSEMOVE事件下产生Drag.
但是OnLButtonDown()必须需要WM_LBUTTONUP
但是如果有了NM_CLICK,就得不到了。

NM_CLICK是一个通知消息,它是由WM_LBUTTONDOWN产生的。

是否产生WM_LBUTTONUP与NM_CLICK的返回值有关,你可以在NM_CLICK中设置一个断点,
mayudong1 2011-01-18
  • 打赏
  • 举报
回复
void CListCtrlEx::OnLButtonDown(UINT nFlags, CPoint point)
{
AfxMessageBox(_T("LButtonDown"));
CListCtrl::OnLButtonDown(nFlags, point);
}

void CListCtrlEx::OnLButtonUp(UINT nFlags, CPoint point)
{
AfxMessageBox(_T("LButtonUp"));
CListCtrl::OnLButtonUp(nFlags, point);
}


看看这样有效果吗?
直接运行,不要加断掉调试
wangbo56916860 2011-01-18
  • 打赏
  • 举报
回复
用onclick事件替换lbuttondown和 lbuttonup
伏神 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tttyd 的回复:]
在Down点击事件中

C/C++ code
//// Capture all mouse messages
SetCapture ();

up事件中

C/C++ code
ReleaseCapture ();
[/Quote]


这个也不行,我之前就尝试过了
wangbo56916860 2011-01-18
  • 打赏
  • 举报
回复
m_listctrl.SetExtendedStyle(LVS_EX_TRACKSELECT | LVS_EX_ONE_CLICKACTIVE);

LVS_EX_ONE_CLICKACTIVE还可以是LVS_EX_TWO_CLICKACTIVE
伏神 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 healer_kx 的回复:]
PreTranslateMessage里面处理好了。
[/Quote]

无效,click还是捕捉不到UP,双击倒是可以
wangbo56916860 2011-01-18
  • 打赏
  • 举报
回复
CListctrl 单click默认是选中状态,双击或者移动后双击 是击中状态
whosyourdaddyzsj 2011-01-18
  • 打赏
  • 举报
回复
用调试,可能会出问题的,你用messagebox看下有没有进入函数,调试的话可能程序会越过去
见习学术士 2011-01-18
  • 打赏
  • 举报
回复
不会吧,你用SPY++分析一下咯
雪影 2011-01-18
  • 打赏
  • 举报
回复
在Down点击事件中
//// Capture all mouse messages
SetCapture ();

up事件中
ReleaseCapture ();

加载更多回复(3)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧