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);


总结

①想成为好程序员,英语很重要。

②细心!细心!再细心!要充分理解英语缩写的完整意思,不能模棱两可。




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值