总结: MFC CListCtrl中加入Checkbox, Vertical Scrollbar以及如何调整Item颜色

最近玩了一下MFC中的CListCtrl, 然后要在ClistCtrl中显示Checkbox, 要求做成CListBox那样的, 只出现Vertical Scrollbar, 最后要在把整个CListCtrl Disable的情况下改变所有Item的颜色, 这么些事情下来(主要有三件), 总结一些注意点和经验教训:

  1. 要在CListCtrl中的每个item前面显示Checkbox, 这个需要使用CListCtrl::SetExtendedStyle()这个方法, 在初始化(InitXXX)窗口或者控件的时候, 把CListCtrl设置成LVS_EX_CHECKBOXES属性.

  2. 我一开始在MFC中的Resource View中把CListCtrl设置成了List View然后希望他像ListBox那样就显示一列也就是只有一个Column的item, 当Item很多的时候以至于超出窗口的时候, 则所有的Item还是保持一列, 并出现竖的滚动条Vertical Scrollbar供用户查看, 事实上当设置成了List View以后, 我的ClistCtrl总是只出现横向的滚动条并且Items会变成多列. 一般的说法是吧CListCtrl属性里面的Alignment设置成Top就会出现竖的滚动条, 如果Alignment是Left那么只会出现横向滚动条, 根据我这里的事情, 那么我觉得就是和CListCtrl的View属性有关, 如果是List View那么总是出现横向滚动条, 不会出现竖的滚动条, 最后我通过把CListCtrl设置成了Small Icon View, 并且把Alignment设置成了Top, 比较理想的达到了我想要的. 这里切记.

  3. 第三件事情是这样的, 我想要Disable这整个CListCtrl, 于是我使用了EnableWindow(FALSE)这个方法, 这样做确实使得CListCtrl不能动了, 整个就灰了, 但是不太满意的地方是里面的Item的颜色和状态似乎都没有改变, 理想的状态是当CListCtrl整个被disabile以后, 里面的文字和Checkbox也相应变化颜色以区分 可写和不可写的状态. 为了达到这个目的, 我自定义了一个CCustomizedListCtrl类继承CListCtrl并且自定义处理了WM_ENABLE message这个消息, 重载了OnEnable()函数, 于是每次CListCtrl这个控件或者窗口改变了Enabled的状态的时候我都可以判断现在窗口成了哪种状态, Disable Or Enable? 并且根据不同的状态设置不同的文字颜色, SetTextColor. 比如出于Enable的时候可以设置成亮黑色, Disable的时候可以这是成白灰色.

Written on February 13, 2014