CListView下CheckBox的显示和注意点

1 篇文章 0 订阅

        最近开始整理以前的资料,所以想慢慢的把整理出来的资料也共享出来。顺便也作为自己的一个记录和回顾


        CListView是很常用的一个View,它支持四种风格和多种扩展风格。其中的LVS_EX_CHECKBOXES扩展风格设置后会在每个item(每行)前生成checkbox。但是需要注意的是,LVS_OWNERDATA风格由于除了每个元素(也就是每行)的选中信息和焦点信息以外的所有属性都不予保存,所以当CListView控件风格为LVS_OWNERDATA的时候,扩展风格LVS_EX_CHECKBOXES是无效的,也就是即使添加设置了LVS_EX_CHECKBOXES扩展风格,在画面上复选框也不会显示出来。在公司内多次碰到这两个风格冲突导致无法正确显示checkbox的问题。

        在添加checkbox后,可能会导致原有行的图标设定出现问题。我原先的部分代码是在OnGetDispInfo中进行图标的设置,在设置checkbox后始终不能正常的将图标显示出来。最后的对应方法是将设置图标的方法调整到OnCustomDraw。在OnCustomDraw内部是调用了View内部CListCtrl控件的SetItem控件进行实现的,使用代码为:GetListCtrl().SetItem(lplvcd->nmcd.dwItemSpec, 0, LVIF_IMAGE, "", image, NULL, NULL, 0);(将某行的第0列的图标设置为ImageList内部的下标为image的图标)。SetItem方法可以对该ListCtrl内部的任意的一个元素的各种状态进行设定,感觉是非常好用非常强大的方法。

    在设置CListView或者CListCtrl的扩展风格为LVS_EX_CHECKBOXES并且设定有效后,CListView 的每一行前面都会显示一个checkbox,但是在部分情况下,我们需要的是只有某些行显示checkbox,而其他行不要显示checkbox。这个问题似乎回答蛮少的,最后这个参考了stackoverflow上的一篇回答,得到了一个方法(由于时间过久,原帖的地址已经找不到了,如果有知道的,可以告诉我),具体是在OnCustomDraw内部添加代码,代码如下:

           //屏蔽checkbox不予显示代码

            LVITEM lvi;

            lvi.stateMask = LVIS_STATEIMAGEMASK;

            lvi.state = INDEXTOSTATEIMAGEMASK(0);

            ::SendMessage(m_hWnd, LVM_SETITEMSTATE, lplvcd->nmcd.dwItemSpec, (LPARAM)&lvi);


            //如果需要显示checkbox,设置一下checkbox的状态就可以了

             GetListCtrl().SetCheck(lplvcd->nmcd.dwItemSpec, TRUE);


对于CListView内每一列的图标的显示,是可以通过之前的SetItem方法进行设定的,即制定某一列显示什么图标。但是在CheckBox之后,似乎始终会显示一列图标,即使将图标隐藏,也会空出相应的空格大小

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值