打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
CListCtrl的分组行
userphoto

2015.03.03

关注
简介
微软的CListCtrl的支持在网格中显示的数据,而且还支持数据分组。本文将展示我们如何能激活CListCtrl的分组功能。
演示应用程序,让您体验如何可用于分组。只需右键单击列标题,对数据进行分组,根据这个头。{S0}
微软延长支持进行分组的CListCtrl,与Windows XP的发布。多新的特点是不松口,并在功能上也有限(没有倒塌的群体)。后来扩展更多的功能,当Windows Vista发布(崩溃,页脚,字幕,以及更多)的实施。
现在已经有一些描述如何使用Windows XP的分组NET文章。{A}
,它描述了在Windows Vista中的一些新的东西。我第一次看到一个有用的应用,使本分组功能使用
。如何在CListCtrl中激活的分组
可激活分组之前,有些事情必须是为了:操作系统必须支持公共控件版本。 6(Windows XP中/ Vista和更新)应用程序必须使公共控件版本。 6通过其清单应用程序必须编译_WIN32_WINNT设置至少0x0501
符合上述要求时,我们可以创建一组这样的:LRESULT CListCtrl_Category_Groups::CreateSingleGroup(int nIndex, int nGroupId, const CString& strHeader){ EnableGroupView( TRUE ); LVGROUP lg = {0}; lg.cbSize = sizeof(lg); lg.iGroupId = nGroupId; lg.state = LVGS_NORMAL; lg.mask = LVGF_GROUPID | LVGF_HEADER | LVGF_STATE | LVGF_ALIGN; lg.uAlign = LVGA_HEADER_LEFT; // Header-title must be unicode (Convert if necessary) lg.pszHeader = strHeader.GetBuffer(); lg.cchHeader = strHeader.GetLength(); nGroupId = InsertGroup(nIndex, &lg ); if (nGroupId==-1) return nGroupId; // Insert all current items into this group for(int nRow = 0; nRow < GetItemCount(); ++nRow) { LVITEM lvItem = {0}; lvItem.mask = LVIF_GROUPID; lvItem.iItem = nRow; lvItem.iSubItem = 0; lvItem.iGroupId = nGroupID; SetItem( &lvItem ); }}
上面的例子代码创建了一个新的组具有以下属性:集团将在集团内部的CListCtrl列表插入在参数nIndex。该小组将得到外部标识符nGroupId。该组的标题,将成为文本字符串strHeader。在Windows XP中的限制
在Windows XP组的工作时,我们会发现以下缺失:这是不可能的,问有多少组在集团内部的CListCtrl列表。相反,它建议创建组自己的轨道。这是不可能遍历组在集团内部的CListCtrl列表。相反,它建议创建组自己的轨道。如果鼠标光标目前已超过一组,这是不可能问的CListCtrl。相反,我们已经做了很多猜测。这是不可能改变组的状态,所以它成为倒塌。
这些限制已经解决与Windows Vista,并在同一时间,已添加以下特点:可以附加一个任务链接到本集团可提供略低于头文字字幕文本本集团提供一个页脚文本使用源代码
提供的源代码演示了如何激活不同的分组功能:InsertGroupHeader() - 创建一个新组。包装周围的CListCtrl::InsertGroup()。SetRowGroupId() - 向现有组添加一行。包装周围的CListCtrl::SetItem()与LVIF_GROUPID。GroupByColumn(INT nCol) - 创建一个新组指定列中的每一个独特的单元格的文本。SortColumn(INT nCol) - 从指定的列所产生的群体进行排序。包装周围的CListCtrl::SortGroups()。GroupHitTest(CONST CPointamp;点) - 试图找到下面的组给定的鼠标点。CheckEntireGroup() - 当CListCtrl的扩展风格LVS_EX_CHECKBOXES的启用,这种方法将改变整个组的复选框的状态。
它还演示如何使用新的Windows Vista功能:CollapseAllGroups() - 遍历所有的群体,使他们崩溃。包装周围的CListCtrl::与LVGS_STATE SetGroupInfo()。SetGroupTask() - 变化的一组任务的链接。当用户单击任务链接,它会产生一个LVN_LINKCLICK消息。SetGroupSubtitle() - 更改字幕的一组。SetGroupFooter() - 更改组页脚。历史2008-09-16 - 第一版的文章2009-09-28 - 反向移植CGridListCtrlEx,并在启动现在组行的第三列的错误修复2011年7月27日 - 固定的臭虫在GroupHitTest()时,在Vista \ Win7的使用和编译_WIN32_WINNT GT =为0x0600;|罗尔夫克里斯滕森
关于作者:理查德Hunn
中国
我是一名编程爱好者,
谢谢orcode.com为我们提供一个学习和分享的平台。
有什么问题。可以就本内容回复,我看到时。会尽量回复的。
评论会员:游客 时间:2011/12/27
最好的文章,我对CListCtrl的分组发现
ZhuJinYong评论会员:游客 时间:2011/12/27
好文章和代码控制组的列表视图有一个问题:为什么lvhitinfo.iGroup总是返回0?ListView_HitTestEx右手食指不能返回{#如果GT_WIN32_WINNT为0x0600=#IFDEFListView_HitTestEx#IFDEFLVHT_EX_GROUP#IFDEFListView_GetGroupInfoByIndexLVHITTESTINFOlvhitinfo={0}lvhitinfo.pt=点;ListView_HitTestEx(m_hWnd,放大器;lvhitinfo);如果((lvhitinfo.flags放大器;LVHT_EX_GROUP)==0)返回-1;LVGROUPLG={0}lg.cbSize=SIZEOF(LG);lg.mask=LVGF_GROUPID;VERIFY(ListView_GetGroupInfoByIndex(m_hWnd,lvhitinfo.iGroup,AMP,LG))返回lg.iGroupId;#ENDIF#ENDIF#ENDIF#ENDIF}2011年7月22日(星期五),下午08:38修改
罗尔夫克里斯滕森评论会员:游客 时间:2011/12/27
对不起迟了回应。我刚回到我的家人,从2个星期的休假是的,你是完全正确的,引用的代码根本不起作用。根据MSDN,然后iGroup将被初始化,如果使用雇主的数据。我会尽量更新的文章,并删除有问题的代码。谢谢你告诉你
。ZhuJinYong评论会员:游客 时间:2011/12/27
通过默认,点击ListivewGroupHeader将选择最上面的非多选模式的项目,并选择上多选择模式。这是不理想。我们能做的子类的消息WM_LBUTTONDOWN,绕过默认的行为。但它可能失去LVN_LINKCLICK通知WM_LBUTTONDOWN,由于消息序列抑制WM_LBUTTONDOWN-GT;LVN_LINKCLICK。我想绕过WM_LBUTTONDOWN,但保持LVN_LINKCLICKnotification.How来解决这个问题呢?你可以通过点击鼠标在GroupHeader测试你的项目,该行为是有点不可思议。有时,本集团内的所有项目都选中,有时没有那么。我很讨厌它。我们必须绕过MS列表视图的默认动作,但它带来的另一个问题,LVN_LINKCLICK抑制WM_LBUTTONDOWN!请做一个试验,并找到解决办法。修改于2011年7月27日(星期三),上午05:11
罗尔夫克里斯滕森评论会员:游客 时间:2011/12/27
我可以重现你所描述的行为,在点击组头,使其改变项目的选择。它总是删除从其他群体中的项目的选择,如果焦点是该组标题链接,那么它会导致组中的所有项目被选中(如果该组任务链接获得焦点,没有项目被选中)。我想,一个邪恶的黑客是之前保存的事件转发到CListCtrl的选择,然后转发的事件后,恢复原来的选择。我猜另一个邪恶的黑客是执行的HitTest,然后检查如果LVHT_EX_GROUP_SUBSETLINK标记,然后手动发送LVN_LINKCLICK。imgsrc=http://www.orcode.com/upimg/2011_12_27_14_05_16_5.gif
ZhuJinYong评论会员:游客 时间:2011/12/27
点击组头,使其改变项目选择。它总是从其他组中的项目删除选择,如果焦点组标题链接,那么它的原因要选择组中的所有项目。我不满意这个有趣的逻辑,这是不能接受的,是不实际的。组任务链接获得焦点,然后选择任何项目组任务链接都保持重点如果被点击!如何清除重点保留一组任务链接后,点击的只有一个?我想,一个邪恶的黑客是之前保存的事件转发到CListCtrl的选择,然后转发的事件后,恢复原来的选择。我猜另一个邪恶的黑客是执行的HitTest,然后检查如果LVHT_EX_GROUP_SUBSETLINK标记,然后手动发送LVN_LINKCLICK。我不能得到的groupId,当鼠标点击组任务链接。不知道为什么的HitTestLVHITTESTINFO.Flags不返回LVHT_EX_GROUP_SUBSETLINK(0x2000000)编辑:LVHT_EX_GROUP_SUBSETLINK是不是组的任务链接!我不知道哪里是这样的标志的HitTest组任务链接imgsrc=http://image83.360doc.com/DownloadImg/2015/03/0320/50725470_6.gif。(imgsrc=http://www.orcode.com/upimg/2011_12_27_14_05_16_6.gif])如果你有时间,请试用。修订于2011年7月28日(星期四),2:17AM
clxye评论会员:{S2} 时间:2011/12/27
tha_specializt评论会员:spaghettie代码 时间:2011/12/27
bondukanthikiran评论会员:游客 时间:2011/12/27
有组织的代码是好的|Pixbyte
您好,是可以禁用/隐藏在该解决方案的HeaderCtrl?Ocrana
评论会员:罗尔夫克里斯滕森 时间:2011/12/27
CListCtrl的支持风格LVS_NOCOLUMNHEADER
使用资源编辑器 - >对话"属性" - >"样式" - >选中复选框"没有列头"
虽然我猜你应该禁用(或支票)所有呼叫GetHeaderCtrl(在解决方案
)评论会员:。jelllove 时间:2011/12/27
它使超过100个错误,当我使用它在VC + + 6.0
我应该怎么办
评论会员:?jelllove 时间:2011/12/27
{S4}的身体知道
评论会员:?Snakefoot 时间:2011/12/27
MFC实现捆绑用VC6不支持群体,因为VC6的CListCtrl的支持群体之前公布。 BR}
解决方法是使用Win32 API调用,而不是。要使用Win32 API调用,然后你需要一个Windows SDK中提供适当的定义使用组
不知道如果VC6中可以直接使用微软最新的Windows SDK。微软已经增加了几个新的关键字,其中只有他们最新的编译器理解。所以,你可能会做一些cut'n'paste用于VC6创建你自己的头文件,包括适当的定义需要在CListCtrl的激活组模式。
你可以看到你看这个文件的底部需要的定义:
]
评论会员:丑陋的野兽 时间:2011/12/27
Snakefoot,
- 谢谢你很好的贡献,我真的很喜欢您的文章,关于CListCtrl的所有
。 - 这是我在做什么:我试图创造一个"报告",这将增加报告标题1第一项属于header1,然后header2,然后.....{ BR} - 那么,我的是:我可以添加header1,可以看到它,我可以插入的第一个项目,我设置LVITEM组与文字标志,我可以看到它显示。不过,我看不到任何分项目,我试图在同一行添加!!!.{ BR} - 在您的例子:你立足于现有的补充项目,只是尽量组它,那你为什么不看这个问题?
- 我使用WINXP,我可以看到标题显示,所以...我以为我可以发挥与周围的??"分组"功能?
的问候,
UglyBeast
评论会员:Snakefoot 时间:2011/12/27
?,我猜您有一个名为InsertColumn不同的子项目??,你可以看到这些列
我猜你有一个叫做SetItemText所有的子项目后称为InsertItem()?
我猜想,如果你禁用分组代码,那么新增加的项目是显示其所有子项
评论会员:vngo 时间:2011/12/27
snakefoot,
- 其实我弄清楚,如果我IDGROUP和TEXT屏蔽标志插入项目一起,我可以看到该项目,然后后(也与文本IDGROUP面具)任何SetItem调用不会"插入"子项的同一行第一个项目。
- 所以,为了插入项目和分项,我只是做正常插入(掩码字段中的文本标记),然后SetItem(掩码字段中的文本)。之后,我将"分配"该行组,然后我会看到整排显示
- 无论如何,感谢您不错的CListCtrl的文章
评论会员:杰拉德尼科尔 时间:2011/12/27
您好,
我的工作与所有者的数据列表控制所有的时间。
当分组与XP的发布,我非常兴奋,直到我注意到有没有所有者数据的支持。 MS所有者的数据列表控件实施支持与Vista?
有趣的是很难找到的人使用所有者的数据列出。一旦你习惯了,有没有回头路。
杰拉德
评论会员:Snakefoot 时间:2011/12/27
我的经验与所有者绘制的CListCtrl(Codeguru和CodeProject上互联网的地方下载时,)是使用作业系统更新时,他们遭受来自许多不同的绘画,怪癖,比当专门CListCtrl的实施已创建。
从这个经验,我通常会尽量远离它们,并为此事还自定义绘制的CListCtrl的尝试执行所有的绘制自己。
但是,回到你对Vista的支持问题。由于没有DrawGroup最新的SDK的方法(好像有一个的DrawItem),那么我很怀疑它
评论会员:。杰拉德尼科尔 时间:2011/12/27
。所有者绘制,不是在谈论谈论所有者的数据
它们是两个完全不同的事情。
他们也被称为虚拟列表控件
评论会员:Snakefoot 时间:2011/12/27
对不起了,不知道为什么我混淆这两个不同的东西{五}
Vista可以执行业主数据模式(但它是相当无证和可能不受支持)分组:
{A9}
{A10}
修改,2009年9月30日,日(星期三)下午06:58
评论会员:yarp 时间:2011/12/27
喜Snakefoot,
我很喜欢读你的CListCtrl的文章。 CGridListCtrlEx和显示/隐藏列文章都非常优雅和CListCtrl类的理解表现出较高水平。我想你应该忽略的univoters。显然,这些人有Microsoft Platform SDK中更新的认识不足。
最美好的祝愿,
大卫Delaune
评论会员:Snakefoot 时间:2011/12/27
我绝对同意与Randor。
我很欣赏你的CListCtrl的文章,我也很欣赏不断更新。你的文章给了我最初的冲动,写我自己的小格在WTL。
谢谢你
Yarp
http://www.senosoft.com/
评论会员:JustADeveloper 时间:2011/12/27
漂亮的恭维{S2}感谢你,虽然我不认为我会学着忽略univoters完全{S2}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
VC中ListCtrl经验总结
CListCtrl,CListView与LVN
VS2010/MFC编程入门之二十八(常用控件:列表视图控件List Control 上)
MFC Controls: The List Control
VC/MFC之ListCtrl控件使用经验总结(转)
CListCtrl的使用
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服