正确响应CListCtrl的单击事件

        同事小张今天上午遇到了一个问题:

        程序是一个多文档的,其中有一个CListView和一个PropertyGrid(属性窗格)。当在list中点击某行的时候,需要在属性窗格中显示当前选中的item对应的数据的属性。

        可是有个问题,症状如下:

        响应LButtonDown():

        第一次单击的时候,在属性窗格中并没有内容。但第二次单击的时候,属性窗格中显示的是第一次选中的行,第三次单击的时候,属性窗格显示的是第二次选中的行……

        最初怀疑是判断选中行的代码有问题,试了CListCtrl::GetNextItem()和CListCtrl::GetFirstSelectedItemPosition()来测试选中行,结果还是不行。

        F9加入断点,单步跟踪,发现第一次点击的时候,“竟然”没有进入if()判断语句内,也就是没有选中行,当然也就不能在属性窗格中显示了。当以后再点击行的时候,就可以进入if语句了。看来现象正是这么产生的。

        他怀疑是不是因为函数刚进入的时候,刚刚点击的行还没有成为selected状态,应该响应的是LButtonUp()吧。

        直到这时我还没有意识到问题的所在。虽然我怀疑他的想法,但是没有证据,就索性让他一试,结果还是如此。

        这时,我仍然怀疑是状态判断不对。然后我突然想到了上半年写过一个程序,用到了类似的需求。于是找到那个代码,打开一看,想确定这种选中状态是怎么确定的,却突然发现了问题的原因。

        响应CListCtrl的单击事件,它属于控件的通知消息,应该这样ON_NOTIFY_REFLECT(NM_CLICK,OnClick)来响应,而他用的是OnLButtonDown(),这是Windows标准消息。他无意识中觉得响应LButtonDown()就是响应OnClick()了,而我在刚开始也在他的那种思维的影响下思考,结果怎么试都不行。把响应的代码直接放到OnClick()函数中,一切正常了。

        问题现在是解决了,只所以这种问题用了多半个小时才解决,一是自己在思考的时候,不自觉受别人思维的影响,二也是对相关的理论知识掌握的不是太深,运用的不是太熟练,否则应该在第一时间就可以直接发现症结所在了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值