一个具有子项格式的自定义绘制列表控件
介绍 列表控件的使用
现在变得非常普遍,并且被许多需要某种列表显示的应用程序所使用。我在许多项目中使用过列表控件,并且自然地开发了自己的类来在列表控件中显示不同的颜色、字体和进度条。 最近我需要一个像Hotmail一样的复选框列表控件。像Hotmail这样的列表在列标题中有复选框,在该列的每个子项目中有复选框。若要在每个子项目中设置复选,请选中列标题中的复选框。类似地,如果取消选中其中一个子项,那么列标题中的复选框也将被选中。 1.4有什么新内容 子条目编辑——感谢Oleg Matcovsky提供的代码,我基于这个实现。 新的组合框实现-感谢Mathias Tunared的优秀AdvComboBox。 跳过禁用的项目-修正了这个错误,允许禁用的项目被选择。 设置标题对齐、文本颜色和分隔线。 设置单元格填充。 减少闪烁。 头复选框不需要资源位图-文件复选框。bmp,仍然包含在下载中,但它不再是真正必要的。 为文本显示启用省略号。 获取子项目的修改标记。 更多的演示构建配置- 1.4包括DLL和静态链接构建配置,3种类型的演示应用-对话框,MDI和属性表-和12个版本的XListCtrl库,包括Unicode和ANSI。 DLL和静态库版本——从这个版本开始,所有的XListCtrl代码都被组织为可以链接的库。下表显示了可用的库版本。 许多bug修复! XListCtrl特性 新的CXListCtrl列表控件类支持以下特性: 可以为每个子项指定文本和背景颜色。 一个或多个子项文本可以显示为普通或粗体字体。 一个或多个子项可以从显示文本切换到显示进度条,然后再切换回显示文本。 可以为进度条指定自定义文本,而不是通常显示10%,20%等。还有一个选项可以不显示进度条的文本,只显示进度条本身。 一个或多个子项可以包含有或没有文本的复选框。 一个或多个子项可以包含combobox控件。 一个或多个子项可以包含编辑控件。 可以禁用一行,这样复选框就无法单击。 标题像Outlook一样显示为平面。 XListCtrl演示 演示项目提供了一个示例应用程序,展示了各种特性的外观。按下Start按钮,列表控件填充数据。 第一列是用复选框指定的 第二列以粗体文本显示子项 第二列显示具有不同背景颜色的子项 第三列包含第2行中的进度条 第四列还包含复选框 第五列显示不同背景颜色的子项 第六列显示具有不同文本和背景颜色的子项 第二列显示combobox 第六行是禁用的 第五列显示编辑控件 如何使用 要将XListCtrl集成到您自己的应用程序中,首先需要决定是要将XListCtrl代码包含到您自己的exe中(使用XListCtrl静态链接库),还是要链接到XListCtrl DLL。如果您计划在多个应用程序中使用XListCtrl,那么使用DLL版本的XListCtrl是有意义的。XListCtrl DLL是一个MFC扩展DLL,所以你的应用程序也必须是基于mvc的。 如果您计划使用和分发XListCtrl的DLL版本,请不要将DLL放在Windows目录中。这可能会导致与其他使用XListCtrl的应用程序发生冲突,并且XListCtrl的未来版本可能与您发布的版本不兼容。 要使用静态XListCtrl库,请在包含头文件XListCtrl.h之前定义符号XLISTCTRLLIB_STATIC。否则,XListCtrl的DLL版本将会链接到你的应用程序。无论你链接的是哪个版本,你都必须改变你的应用程序的构建环境,如下所示: 转到项目|设置| C/ c++ |预处理器,并将XListCtrl源目录添加到附加的包含目录。同样,在设置对话框的左边,选择所有配置。单击OK保存此设置。 转到项目|设置|链接| Input,并将XListCtrl库目录添加到附加的库路径。同样,在设置对话框的左边,选择所有配置。单击OK保存此设置。 自动库选择 使用符号_AFXDLL, XLISTCTRLLIB_STATIC, _DEBUG,和_UNICODE,下面的代码在XListCtrl.h自动决定哪个XListCtrl库链接到你的应用:收缩,复制Code
#ifndef XLISTCTRLLIB_NOAUTOLIB #if defined _AFXDLL && !defined XLISTCTRLLIB_STATIC // MFC shared DLL with XListCtrl shared DLL #ifdef _UNICODE #ifdef _DEBUG #pragma comment(lib,"XListCtrlDDDU.lib") #pragma message("Automatically linking with XListCtrlDDDU.lib") #else #pragma comment(lib,"XListCtrlDDRU.lib") #pragma message("Automatically linking with XListCtrlDDRU.lib") #endif #else #ifdef _DEBUG #pragma comment(lib,"XListCtrlDDDA.lib") #pragma message("Automatically linking with XListCtrlDDDA.lib") #else #pragma comment(lib,"XListCtrlDDRA.lib") #pragma message("Automatically linking with XListCtrlDDRA.lib") #endif #endif #elif defined _AFXDLL && defined XLISTCTRLLIB_STATIC // MFC shared DLL with XListCtrl static lib #ifdef _UNICODE #ifdef _DEBUG #pragma comment(lib,"XListCtrlDSDU.lib") #pragma message("Automatically linking with XListCtrlDSDU.lib") #else #pragma comment(lib,"XListCtrlDSRU.lib") #pragma message("Automatically linking with XListCtrlDSRU.lib") #endif #else #ifdef _DEBUG #pragma comment(lib,"XListCtrlDSDA.lib") #pragma message("Automatically linking with XListCtrlDSDA.lib") #else #pragma comment(lib,"XListCtrlDSRA.lib") #pragma message("Automatically linking with XListCtrlDSRA.lib") #endif #endif #elif !defined _AFXDLL && defined XLISTCTRLLIB_STATIC // MFC static lib with XListCtrl static lib #ifdef _UNICODE #ifdef _DEBUG #pragma comment(lib,"XListCtrlSSDU.lib") #pragma message("Automatically linking with XListCtrlSSDU.lib") #else #pragma comment(lib,"XListCtrlSSRU.lib") #pragma message("Automatically linking with XListCtrlSSRU.lib") #endif #else #ifdef _DEBUG #pragma comment(lib,"XListCtrlSSDA.lib") #pragma message("Automatically linking with XListCtrlSSDA.lib") #else #pragma comment(lib,"XListCtrlSSRA.lib") #pragma message("Automatically linking with XListCtrlSSRA.lib") #endif #endif #else #pragma message(" ") #pragma message("-------------------------------------" + "-------------------------------------") #pragma message(" The SD build configuration (MFC static," + " XListCtrl DLL) is not available. ") #pragma message("-------------------------------------" + "-------------------------------------") #pragma message(" ") #error This build configuration is not available. #endif #endif
库命名约定 XListCtrl库命名约定aseANSIUNICODEXListCtrlDDDA , , , , XListCtrlDDDU , , ,, XListCtrlDDRA , ,, , XListCtrlDDRU , ,, , XListCtrlDSDA ,, , , XListCtrlDSDU ,, ,, XListCtrlDSRA ,, , , XListCtrlDSRU ,, , , XListCtrlSSDA , , , XListCtrlSSDU , ,, XListCtrlSSRA , , , XListCtrlSSRU , , , XListCtrlSDxx——未构建 建筑XListCtrl库 要构建XListCtrl库,点击build |批处理构建并选择您想要构建的库: 然后单击Rebuild All,库将被构建。默认情况下,.lib和.dll文件被复制到bin目录。 提示和技巧 重建对话框演示-如果你重建任何一个对话框演示,一定要使用重建所有命令。原因:对话框演示都共享相同的输出文件目录,如果只编译一个模块,并尝试链接使用不同构建选项集编译的模块,则会得到链接器错误。 消除闪烁-当更新或填充列表控件时,有时会出现闪烁的列表控件和/或对话框上的其他控件。要消除这种闪烁现象,您可以尝试以下方法之一: 使用CListCtrl::LockWindowUpdate()/CListCtrl::UnlockWindowUpdate()括号更新代码。 使用CListCtrl::SetRedraw(FALSE)/CListCtrl::SetRedraw(TRUE)将更新代码括起来。 在使用这些方法之一之后,您可能应该调用list.UpdateWindow()以确保控件得到更新。如果一种方法不能完全消除应用程序中的闪烁,请尝试其他方法来确定哪种效果最好。 使用工具提示-你必须首先调用CListCtrl::EnableToolTips(TRUE)。 使用combobox和编辑控件——必须设置LVS_EX_FULLROWSELECT样式。 修订历史 1.4版本的变化 子条目编辑 新的组合框实现 跳过禁用物品 设置标题对齐、文本颜色和分隔线的api 设置单元格填充 减少闪烁 标题复选框不需要资源位图 为文本显示启用省略号 获取子项目修改标记的API 更多演示构建配置 DLL和静态库版本 许多bug修复! 1.3版本的变化 这个版本包含了很多已经积累的错误修正。我感谢所有报告bug的人。请尝试这个新版本,如果发现任何bug,或者对未来的改进有建议,请告诉我。 增加了hot-tracking到combo的列表框。 添加编译时选项,以删除对组合框的支持。(这减少了exe大小约8 Kb)。要移除combobox支持,请将此行放入stdafx中。h:隐藏,#定义DO_NOT_INCLUDE_XCOMBOLIST复制代码 如果插入此定义,则不需要在项目中包括XComboList.cpp或XComboList.h。 更改CXComboList::SetActive接受滚动条宽度作为输入参数。 修正了当点击外部项目字符串时字符串不显示的错误(由James Moore报告)。这也会在属性页面和其他地方造成问题。 修正了一些字符串没有被选中的错误,当拖拽选择几个项目时(由James Moore报告)。 修正了在标题和列表控件中显示图像的几个问题(由Scot Brennecke报告)。 更改了NM_CLICK和LVN_COLUMNCLICK的消息映射宏,使用ON_NOTIFY_REFLECT_EX(),允许父线程也处理消息(由bkupcins建议)。 修正了XP主题化启用时XHeaderCtrl的问题。GetHeaderCheckedState()/SetHeaderCheckedState()函数现在使用0 = no复选框,1 = unchecked复选框,2 = checked复选框。注意:checkboxes.bmp文件也被更新了,并且必须在所有使用1.3 XListCtrl的项目中被替换。新定义了XHEADERCTRL_NO_IMAGE、XHEADERCTRL_UNCHECKED_IMAGE和XHEADERCTRL_CHECKED_IMAGE在头控件中设置图像时应该使用(例如,请参阅xlistctrltestdll .cpp)。 用ctor中设置的类变量替换对GetSysColor()的调用。类变量被重新加载以响应WM_SYSCOLORCHANGE消息(由KarstenK建议)。 如果使用的组合框没有LVS_EX_FULLROWSELECT样式,则添加断言。 当组合框选择被改变(WM_XLISTCTRL_COMBO_SELECTION)和当复选框被点击(WM_XLISTCTRL_CHECKBOX_CLICKED)时,XListCtrl将发送给它的父对象的两个注册消息。示例应用程序展示了如何处理这些新消息。 增加了对工具提示的支持。要启用工具提示,您必须调用CListCtrl::EnableToolTips(TRUE)。如果您#定义常量NO_XLISTCTRL_TOOL_TIPS,那么工具提示支持将不包括在内。工具提示的新API:隐藏复制CodeBOOL SetItemToolTipText(int nItem, int nSubItem, LPCTSTR lpszToolTipText); GetItemToolTipText(int nItem, int nSubItem); 空白DeleteAllToolTips (); 这次1.2.1版本的变化 添加构建进行gurations Unicode。 支持Unicode字符串的次要代码修改。 1.2版本的变化 组合框! !现在您可以为一个或多个子项指定下拉列表组合框。 当项目被突出显示时,组合框将被绘制。演示现在有项目热跟踪。 合并了David Patrick关于如果CXListCtrl是通过Create()而不是通过对话框模板动态创建的,如何子类化头部控件的建议。有关如何将演示项目转换为动态创建CXListCtrl的详细信息,请参阅xlistctrltestdll .cpp。 调整了子项的绘制,使视觉更加清晰。 增加了GetCurSel和SetCurSel的API,使编码更容易。 致谢 CXListCtrl代码基于: Michael Dunn的《使用自定义绘制列表控件要做的整洁事情》 马尔滕·霍本(Maarten Hoeben)的《Outlook 98-Style FlatHeader Control》(Outlook 98-Style FlatHeader Control) Ghini Mauro的“指示空ListView” 这个城市的人口数字来自于。布林霍夫:世界上的主要聚集地。 使用 这个软件被发布到公共领域。您可以自由地以您喜欢的任何方式使用它,除非您不能出售此源代码。如果您修改或扩展了它,请考虑在这里发布新的代码供大家分享。本软件是“按原样”提供的,没有明示或隐含的保证。我不承担任何损害或损失的业务,该软件可能造成的。 本文转载于:http://www.diyabc.com/frontweb/news293.html