CListCtrl 部分消息被内部拦截了

Spirite_hunter 2018-08-07 02:27:55
为了实现在CListCtrl单元格里添加按钮,为NM_CLICK添加了消息处理函数,功能确实是完成了;

可是在之后的测试中无意间发现,快速点击时,有时候明明已经选中了某一行,而且这一行已经高亮了,但是消息处理函数却没有被触发;

通过在函数内输出日志+spy++查看消息,发现了一个奇怪的问题,spy++里输出的点击次数明显比函数日志输出要多,那就是CListCtrl内部拦截了?还是内部有限制点击频率?那高亮是怎么回事?

有知道内幕的朋友可以畅所欲言
...全文
76 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Spirite_hunter 2018-08-07
  • 打赏
  • 举报
回复
对,如果是这样的话,那就说的通了,快速来回点击有可能DOWN和UP 发生在不同的单元格上,这样CListCtrl 内部在处理时就会出问题,也就无法产生NM_CLICK;

以前好像还遇到过类似的问题,没想到这上面来,十分感谢!
schlafenhamster 2018-08-07
  • 打赏
  • 举报
回复
单击事件是在同一元素上发生了鼠标按下事件之后又发生了鼠标放开事件时才发生的;
使用 WM_LBUTTONDOWN (or UP)
Spirite_hunter 2018-08-07
  • 打赏
  • 举报
回复
试了一下,应该不是这个问题,基本上是一句afxDump 输出,一句OutputdebugString;

我想了一下,把OutputdebugString 提到整个函数最前面,这样就算抛异常也不会影响到输出;
结果发现,快速在不同行之间来回点击,输出只有3句,但是点击次数绝对大于3次;

用spy++看消息,发现WM_LBUTTONDOWN的次数确实大于OutputdebugString输出的次数,感觉像是消息丢了或者转成其他消息了
schlafenhamster 2018-08-07
  • 打赏
  • 举报
回复
怀疑 m_list.GetSubItemRect(pNMItem->iItem, 1, LVIR_BOUNDS, rc);
有问题
Spirite_hunter 2018-08-07
  • 打赏
  • 举报
回复
第一句代码的作用是什么?是怀疑获取到的单元格矩形区域有问题,导致抛异常了没有输出OutputdebugString吗?
schlafenhamster 2018-08-07
  • 打赏
  • 举报
回复
afxDump << rc << "\n";// 检查 rc !
m_Btn.MoveWindow(rc);
Spirite_hunter 2018-08-07
  • 打赏
  • 举报
回复
代码在内网,拷出来有点麻烦,上个伪代码

void CMyDlg::OnNMClick()
{
CRect rc;
m_list.GetSubItemRect(pNMItem->iItem, 1, LVIR_BOUNDS, rc);

m_Btn.MoveWindow(rc);

OutputdebugString(...);
}
schlafenhamster 2018-08-07
  • 打赏
  • 举报
回复
"为NM_CLICK添加了消息处理函数"
代码 ?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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