本文主要是介绍CListCtrl控件样式设置时出现的小插曲!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
----------------------------------------------------------------------------------------------------------------------------------------
最近在写MFC,用到了列表控件CListCtrl,由于要依据项目需求对列表控件设置样式Style。
很多人都知道可以在CListCtrl的Create()函数中设置列表控件的基本样式;同时一些扩展样式可以通过CListCtrl的SetExtendedStyle()函数进行设置。
但是上面的两种方式有什么区别呢?样式的宏可以随意选上面两个函数中的一个进行设置吗?
答:①有区别;②不可以
----------------------------------------------------------------------------------------------------------------------------------------
例如下面的这段代码,设置了一些样式,运行也正常:
mDataList.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT,Rect,this,IDC_JM_DATALISTCTRL);//设置拓展风格,①显示表格网格线;②选中整行数据mDataList.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
接下来我想设置列表控件使其只支持每次只能选中一行:默认情况CListCtrl支持多选,LVS_SINGLESEL属性可以使其支持单行选取。
与时我想当然的在SetExtendedStyle()函数中增加了宏LVS_SINGLESEL,然而奇怪的事情发生了!居然效果是这样的:
不但没有出现我想要的只支持单行选取的效果,反而增加我不想要的样式(最左边“任务名称”那列中出现了复选框)!很郁闷!
问题解析:
我们知道这些样式的宏定义只是一个十六进制的数值而已,要是想看这些宏的具体数值,可选中宏,右键【转到定义】即可查看。
LVS_****开头的宏定义截图如下:
LVS_EX_****开头的宏定义截图如下:
聪明的你可能已经发现猫腻了:LVS_SINGLESEL居然和LVS_EX_CHECKBOXES的十六进制的值一样,都是4。
这就是bug所在,虽然都是用来设置CListCtrl控件的宏,LVS_*****开头和LVS_EX_****开头是不一样的,不能混用。
区别如下
①LVS_是ListViewStyle的缩写;LVS_EX_是ListViewStyle_Extended的缩写。
②使用地方不同:LVS_****只能用在创建列表控件时使用,即在Create()函数中使用;而LVS_EX_****只能在设置列表扩展样式时使用,即在SetExtendedStyle()函数中使用。
因此要想实现列表控件只支持单行选取,正确的修改上述代码的方式如下:
//默认情况CListCtrl支持多选,LVS_SINGLESEL属性可以使其支持单选 mDataList.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT|LVS_SINGLESEL,Rect,this,IDC_JM_DATALISTCTRL); //设置拓展风格,①显示表格网格线;②选中整行数据 mDataList.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
总结
①想成为好程序员,英语很重要。
②细心!细心!再细心!要充分理解英语缩写的完整意思,不能模棱两可。
这篇关于CListCtrl控件样式设置时出现的小插曲!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!