返回首页


简介
从一个MFC背景的到来,我还以为它是关于时间,我开始一个新的科技之旅后,学习如何开发看中。NET应用程序,并与我的新发现在C#中的知识打动每个人。时髦的新平台上,因为我已经作出了很大的进展,从CLR的内部学习C#语言的语法。不过,我有一个小的琐碎的问题不会消失。这不我兴奋。它为什么不兴奋,我是百思不得其解,因为每个人,我发言,我读的几乎一切似乎认为最好的东西NET框架,因为有人节省每个人都懒得自己的面包切片的好主意 -​​ 也许这是一个控制的事情,也许我需要"放手"。
无论如何,这漫无边际的真正属于在另一篇文章,但是,它作为一个很好的介绍如何来到我发现WTL的服务,为什么我不能似乎在世界上的C习惯踢赞成名利就是的。NET。顺便说一下,我也应该指出,我爱彗星,和WTL我兴奋。背景
虽然学习使用WTL的,我决定,我写了前一阵子,我将开始移植清单控制使用MFC和改善一路上。这篇文章是我努力的成果 - 又一列表控制,支持多种功能,但毫无疑问并不完全尽一切你要找的。但是,在这其中的乐趣!特点 Vista风格的项目选择。主题或经典的UI支持。项目或子项目的选择。子项目编辑,组合框,日期/时间。超链接"复选框(正常和三态)和进度条(主题和固体)。标题列拖放重新排序。内置支持列排序。Groovy中寻找alpha混合组选择框。双缓冲无闪烁绘图(带有WTL的)。平滑滚动(减速)。Titletips(不要混淆工具提示,但支持)。一切看起来快活尼斯(不是一个真正的功能,但我想我会提到)。嵌入式数据结构或类的支持(稍后我将谈及这)。压倒一切的数据源(我后来也将谈及这)。其他
你可能有兴趣知道,我也有一个树控件,致意的绘画风格,在CListCtrl的使用。如何使用CListCtrl的
首先,我认为这将是一个好主意,解释子项目和列的格式/标志,可用于控制如何在列表控件中显示和编辑文本。可设置的项目,格式列级,这意味着根据该列中的所有子项相同的格式,或在一个单独的子项目级别,将覆盖列的格式。列/子项目格式的一个例子,可以发现其中的"第5列"列级格式的ITEM_FORMAT_PROGRESS演示,但它的个别子项目,以证明其他格式覆盖。
我鼓励你发挥演示;然而,这被CodeProject上,我猜你可能已经这样做。对于那些想更多的细节,这里是让你去使用通用的CListCtrl所需的基本函数:void SetImageList( CImageListamp; ilItemImages)说明:
分配一个列表控制项的图像列表。参数:ilItemImages - 参考图像列表。无效AddColumn( CListColumnamp; listColumn)无效AddColumn( LPCTSTR lpszText,   ; INT nWidth = 0, INT nImage = ITEM_IMAGE_NONE 布尔bFixed = FALSE UINT nFormat = ITEM_FORMAT_NONE UINT nFlags = ITEM_FLAGS_NONE)说明:
添加一个列的列表控件。参数:listColumn - 参考结构描述列详细。lpszText - 列标题标题字符串。nWidth - 列的宽度,以像素为单位。nImage - 指数的ImageList显示在列标题。bFixed - 固定列宽的真实。nFormat - 描述列中的所有子项的格式:ITEM_FORMAT_NONE - 默认的,只读的子项目。ITEM_FORMAT_EDIT - 编辑子项目。ITEM_FORMAT_DATETIME - 日期/时间子项目。ITEM_FORMAT_COMBO - 组合框子项目。ITEM_FORMAT_CHECKBOX - 2个状态复选框子项目。ITEM_FORMAT_CHECKBOX_3STATE - 3个状态复选框子项目。ITEM_FORMAT_HYPERLINK - 超链接(点击)的子项目。ITEM_FORMAT_PROGRESS - 进度指标子项目。ITEM_FORMAT_CUSTOM - 自定义子项目。nFlags - 位掩码描述列的格式类型:ITEM_FLAGS_NONE - 无格式的标志(默认)。ITEM_FLAGS_LEFT - 左对齐列标题和子项的文本。ITEM_FLAGS_RIGHT - 右对齐列标题和子项的文本。ITEM_FLAGS_CENTRE - 中心列标题和子项的文本。ITEM_FLAGS_READ_ONLY - 列的子项是只读的(ITEM_FORMAT_CHECKBOX [_3STATE]或ITEM_FORMAT_DATETIME有用的)。ITEM_FLAGS_EDIT_UPPER - 编辑文本是被迫为大写(ITEM_FORMAT_EDIT或ITEM_FORMAT_COMBO ITEM_FLAGS_COMBO_EDIT)。ITEM_FLAGS_EDIT_NUMBER - 编辑文本数值(ITEM_FORMAT_EDIT或ITEM_FORMAT_COMBO ITEM_FLAGS_COMBO_EDIT)。ITEM_FLAGS_EDIT_FLOAT - 编辑文本浮点(ITEM_FORMAT_EDIT或ITEM_FORMAT_COMBO ITEM_FLAGS_COMBO_EDIT)。ITEM_FLAGS_EDIT_NEGATIVE - 编辑文本允许负数(ITEM_FLAGS_EDIT_NUMBER或ITEM_FLAGS_EDIT_FLOAT)。ITEM_FLAGS_EDIT_OPERATOR - 数字文本之前,可以先通过"GT;","<="等(ITEM_FLAGS_EDIT_NUMBER或ITEM_FLAGS_EDIT_FLOAT)。ITEM_FLAGS_COMBO_EDIT - 组合框包含编辑控件(ITEM_FORMAT_COMBO)。ITEM_FLAGS_DATE_ONLY - 只有日期显示或编辑(ITEM_FORMAT_DATETIME)。ITEM_FLAGS_TIME_ONLY - 只有时间显示或编辑(ITEM_FORMAT_DATETIME)。ITEM_FLAGS_DATETIME_NONE - 允许在日期/时间日期选择器(ITEM_FORMAT_DATETIME)"无"。ITEM_FLAGS_PR​​OGRESS_SOLID - 进度条绘制在扎实的作风(ITEM_FORMAT_PROGRESS)。 INT的AddItem(  60;CListItemlt; TData GT;放大器; LISTITEM)INT的AddItem(   ;LPCTSTR lpszText, INT nImage = ITEM_IMAGE_NONE &# 160; UINT nFormat = ITEM_FORMAT_NONE UINT nFlags = ITEM_FLAGS_NONE)说明:
添加项目到列表控件。参数:LISTITEM - 参考结构描述了所有项目的详细信息。lpszText - 第一子项的文字。nImage - 指数的ImageList显示在第一个子项目(见SetImageList)。nFormat - 描述了第一个子项目的格式(见说明AddC​​olumn)。nFlags - 位掩码,它描述的子项的格式类型(见说明AddC​​olumn)。布尔SetItemText(   ; INT nItem, INT nSubItem, LPCTSTR lpszText说明:
设置子项的文字。参数:nItem - 指数项(零指数)。nSubItem - 指数子项(零指数)。lpszText - 子项的文字。布尔SetItemDate( INT nItem, INT nSubItem, 0; SYSTEMTIMEamp; stItemDate)说明:
设置子项的日期(ITEM_FORMAT_DATETIME子项目)。参数:nItem - 指数项(零指数)。nSubItem - 指数子项(零指数)。stItemDate - 参考SYSTEMTIME结构。布尔SetItemComboIndex( INT nItem,  60; INT nSubItem, INT参数nIndex)说明:
设置子项目ComboBox项选择(ITEM_FORMAT_COMBO子项目)。参数:nItem - 指数项(零指数)。nSubItem - 指数子项(零指数)。参数nIndex - 指数组合框列表设置。布尔SetItemCheck( INT nItem, INT nSubItem, INT nCheckValue)说明:
设置子项的复选框的状态(ITEM_FORMAT_CHECKBOX和ITEM_FORMAT_CHECKBOX_3STATE子项目)。参数:nItem - 指数项(零指数)。nSubItem - 指数子项(零指数)。nCheckValue - 代表复选框的状态:0 - 未检查的(或三态未定义)。1 - 检查(或"嘀"三态)。-1 - "跨"三态(2状态复选框不适用)。布尔SetItemImage( INT nItem, & #160;INT nSubItem, INT nImage)说明:
设置子项目的形象。 参数:nItem - 指数项(零指数)。nSubItem - 指数子项(零指数)。nImage - 指数的ImageList显示在子项目(见SetImageList)。布尔SetItemFormat( INT nItem, INT nSubItem, UINT nFormat UINT nFlags = ITEM_FLAGS_NONE)布尔SetItemFormat( INT nItem, INT nSubItem, UINT nFormat UINT nFlags, &# 160; CListArray LT; CString的GT;放大器; aComboList)说明:
设置子项的格式(覆盖列的格式)。参数:nItem - 指数项(零指数)。nSubItem - 指数子项(零指数)。nFormat - 描述子项的格式(见说明AddC​​olumn)。nFlags - 位掩码,它描述的子项的格式类型(见说明AddC​​olumn)。CListArray LT; CString的GT;放大器; aComboList - 用于填充组合框(ITEM_FORMAT_COMBO)的字符串。布尔SetItemFont( & #160; INT nItem, INT nSubItem, HFONT HFONT)说明:
子项的字体设置(覆盖标准字体)。参数:nItem - 指数项(零指数)。nSubItem - 指数子项(零指数)。HFONT - GDI的字体句柄。布尔SetItemColours( INT nItem, &# 160; INT nSubItem, COLORREF rgbBackground & #160;COLORREF rgbText)说明:
设置子项目的背景和文本颜色(标准颜色覆盖)。参数:nItem - 指数项(零指数)。nSubItem - 指数子项(零指数)。rgbBackground - 子项目背景的RGB值。rgbText - 子项文本的RGB值。无效ShowThemed( & #160;布尔bShowThemed = TRUE,)说明:
覆盖默认的头和选择绘图(适用于XP)。参数:bShowThemed - TRUE =画为主题的头和选择; FALSE,=经典模式。无效SetSmoothScroll(  0;布尔bSmoothScroll = TRUE,)说明:
平滑滚动列表时,传呼或行滚动。参数:bSmoothScroll - TRUE = FALSE,平滑滚动; =正常滚动。无效SetBackgroundImage( HBITMAP hBackgroundImage 布尔bTileImage = FALSE)说明:
设置背景位图图像。参数:hBackgroundImage - 处理位图设置为背景。bTileImage - TRUE =平铺图像;假 - 绘制图像居中。无效ShowHeader( 布尔bShowHeader = TRUE,)说明:
显示或隐藏列表标题。参数:bShowHeader - TRUE =显示列表头; FALSE =隐藏列表头。无效ShowHeaderSort( 布尔bShowSort = TRUE,) 说明:
(头)显示排序箭头和支持列排序。参数:bShowSort - TRUE =支持列排序; FALSE,=隐藏排序箭头。无效SetSingleSelect( 布尔bSingleSelect = TRUE,)说明:
只允许一个选择(禁用多个和集团选择)。参数:bSingleSelect - 真=单个项目的选择只有返回FALSE =支持多组选择。无效SetFocusSubItem( 布尔bFocusSubItem = TRUE,)说明:
支持子项目的重点或整个项目的选择。参数:bFocusSubItem - TRUE =支持子项目的重点; FALSE =整个项目的重点。如何使用CListCtrlDatalt;类TData GT;
CListCtrl的支持SetItemData和GetItemData;这些设置和检索DWORD值,从列表中可以使用任何你喜欢的项目。但是,您可能会发现更多有用的整合,直接到控制你的数据结构或类(或嵌入)。对于这一点,你需要的模板类的CListCtrlData(一个这样的例子可以发现在演示应用)。以下功能可用于访问这个数据:BOOL SetItemData( INT nItem, TDataamp; tData)说明:
分配到一个项目的数据。参数:nItem - 指数项(零指数)。tData - 数据结构或类(模板类的声明中定义的类型)的引用。布尔GetItemData( INT nItem, TDataamp; tData)说明:
从项目中获取数据。参数:nItem - 指数项(零指数)。tData - 数据结构或类(模板类的声明中定义的类型)的引用。如何使用CListImpl
有时候,这是不太够使用的通用控制。您可能希望:添加新的功能控制,自定义绘图,或以上列表中的数据源,采取总量控制。
由于存在的明确分开的接口,并在数据源设计CListImpl内置,您可以简单地派生一个类,并覆盖了数据的存取功能,从而采取的数据源的总所有权包括如何的数据是存储和访问。在演示中,你会发现CListUserData - 这个类存储CUserProfiles(例如类)各自为阵,并返回相关的文字或图像GetItemText和GetItemImage。在派生类中所需的唯一强制性功能:INT GetItemCount()说明:
返回的数据source.CString GetItemText的项目数( INT nItem, INT nSubItem)说明:
返回的子项的文字。参数:nItem - 指数项(零指数)。nSubItem - 指数子项(零指数)。历史1.0 - (2006年3月10日)首次发行。1.1 - (2006年3月13日)VS2005的小错误修复 - 感谢chengang。1.2 - 2006年3月(17)更正下VS2005的编译时"访问冲突",并补充ShowThemed。1.3 - (2006年3月27日)增加了自动滚动时集团选择 - 建议,Slaham表示感谢。1.4 - 2006年4月(第5)增加了平滑滚动(SetSmoothScroll)和固定的Windows 2000的问题 - 感谢ihanz123。1.5 - (2006年4月10日)增加背景图片的支持和SetItemComboIndex - 感谢您的建议,MyRock。最后
为妙此列表控制,我怕我不能把所有的功劳,因为它利用来自所有来源的方式,包括在CodeProject上发布的文章囊括的各种代码。正如您可能期望,想法和代码段都被偷走了,无情地扭到这个项目,并在这个过程中,通过我的编码风格。任何人承认他们的工作和尚未计入(给我发电子邮件,我将修改我的确认),但下面的道歉,我给指向正确的方向我表示感谢。致谢。。| AlanW

回答

评论会员:游客 时间:2011/12/06
WTLCImageList类没有析构函数,必须调用的destroy()运行ImageList_Destroy。〜CListImpl(){m_ilListItems.Destroy()m_ilItemImages.Destroy()}更新于7月3日(星期日),2:58AM2011年
kent_fu
评论会员:游客 时间:2011/12/06
?"ListCtrl的"模型"对话框中,关闭模式对话框每次GDI对象将增加4,为什么{BR}
会员3981704
评论会员:游客 时间:2011/12/06
CMainDlg::OnInitDialog中HICON的hIcon=At​​lLoadIconImage不会释放...地址DESTORY()LRESULTCMainDlg::OnDestroy(UINT/*uMsg*/,WPARAM/*wParam参数*/,LPARAM/*lParam的bHandled*/BOOLamp;/**/){HICON的hIcon=GetIcon(真)DestroyIcon(HICON);HICON=GetIcon(FALSE)DestroyIcon(HICON);返回0;}
davem1
评论会员:游客 时间:2011/12/06
?搜索通过控制循环中的所有行一列值是否有可能换句话说,直接搜索所需的值的项目/子项目阵列结构{BR},戴夫{BR}
__ RJH__
评论会员:游客 时间:2011/12/06
喜{BR!}首先,非常漂亮的工作,感谢很多演示!当运行演示一切工作出精品,到现在为止我没有问题imgsrc=http://www.orcode.com/upimg/2011_12_06_08_37_14_1.gif但是,当我退出演示编译器的抱怨有关serveral的"第一次机会异常"在不同的内存位置。在输出窗口,它显示了约50行这样的:第一次机会异常0x76a6b08eListCtrlDemo.exe:微软C异常:错误在内存位置0x0012b700..这是什么意思,有没有人有个主意?我试图把此行的最后一个主要methos:AtlDumpMemoryLeaks()这包括在其他的ATL声明一起包括:#不过,我不能得到这个检查和运​​行,因为它抱怨了很多有关的问题在GDI文件...,我无法找到任何网络上的这一特点支持......总而言之,任何人都可以帮助我提到的两个问题?1)各种第一次机会异常,和2)如何使用正确AtlDumpMemoryLeaks()工具。在此先感谢!罗伯特
ljx665
评论会员:游客 时间:2011/12/06
谢谢分享imgsrc=http://www.orcode.com/upimg/2011_12_06_08_37_14_2.gif我这么差,所以我必须努力
。futurejo:
|
评论会员:joyjjjz 时间:2011/12/06
非常感谢你
评论会员:johnnybaby 时间:2011/12/06
感谢再次为这个伟大的控制。 BR}
我看到前面的消息,它似乎在说,这种控制在商业软件的使用是确定。
是正确的,并且可以在一个封闭源代码的商业产品使用? 这是任何特定的授权下发布源代码吗? 约翰
评论会员:游客 时间:2011/12/06
johnnybaby:|imgsrc=http://www.orcode.com/upimg/2011_12_06_08_37_14_1.gif
hunkymonkey
评论会员:游客 时间:2011/12/06
我不能找到一种方法,使其显示一个多行编辑控制。也许我只是没有努力就够了吗?我喜欢控制-它看上去很不错。但没有多行选项,我不能在我的项目中使用它
。alendarthechef
评论会员:游客 时间:2011/12/06
我必须承认,我没有看过的文章。我读过一些其他物品代码项目,然后下载的代码,只感到失望。我敢肯定我不是唯一一个运行代码的第一,然后读取。没有运行,没有读。它的快速和小。没有MFC的!太棒了!由于我不维护旧代码,我并不需要一个MFC版本我在VS2008编译WTL的8.0:工作得很好,不得不改变ListCtrl.h一行:2542号法律公告: 前:的OnTimer(UINTnIDEvent,TIMERPROC定时器)后:的OnTimer(UINTnIDEvent)谢谢!
。Vlasta_
评论会员:游客 时间:2011/12/06
...会记住你的文章,当我需要一个自定义列表控制并顺便,我与你同在。NET与WTL的问题。早在2002年,我决定是否使用。净或WTL的一个更大的项目,并感谢上帝,我选择了WTL的。。NET带走了太多imgsrc=http://www.orcode.com/upimg/2011_12_06_08_37_14_4.gif的。
卡斯滕舒尔茨
评论会员:游客 时间:2011/12/06
#包括DONT存在DONT工作,作为源在我看来更多的垃圾头:
1 | KaSA1。 DrawCustomItem必须是虚拟的,正确的压倒一切的:
虚拟无效DrawCustomItem(CDCHandle dcPaint,INT nItem,INT nSubItem,CRECT rcSubItem)
{
ATLASSERT(FALSE); / /必须在派生类
实施}
2。而不是
/ /自定义绘制子项目格式
(nItemFormat == ITEM_FORMAT_CUSTOM)
{
PT - GT; DrawCustomItem(dcPaint,nItem,nSubItem,rcSubItem)
返回
}
应该是:
/ /自定义绘制子项目格式
(nItemFormat == ITEM_FORMAT_CUSTOM)
{
PT - GT; DrawCustomItem(dcPaint,nItem,nSubItem,rcSubItem)
继续;
}

评论会员:游客 时间:2011/12/06
KaSA1|嗨!非常有用的控制,非常感谢!不过,我想我已经找到了OnRButtonUp处理程序中的小虫子。无效OnRButtonUp(UINTnFlags,口岸系统点){INTnItem=NULL_ITEMINTnSubItem=NULL_SUBITEM如果(!的HitTest(点,nItem,nSubItem))ResetSelected()//右键单击项目的通知父NotifyParent(nItem,nSubItem,LCN_RIGHTCLICK);}所以,没事的时候是选择,传递一个垃圾LCN_RIGHTCLICK处理程序,因为HitTest的修改nItem和nSubItem值。我认为,它应该看起来像这样:无效OnRButtonUp(UINTnFlags,口岸系统点){INTnItem=NULL_ITEMINTnSubItem=NULL_SUBITEM如果(!的HitTest(点,nItem,nSubItem)){nItem=nSubItem=NULL_ITEM;ResetSelected()//右键单击项目的通知父NotifyParent(nItem,nSubItem,LCN_RIGHTCLICK);}谢谢,塞尔。
琼阮
评论会员:游客 时间:2011/12/06
非常感谢伟大的控制当改变ITEM_HEIGHT_MARGIN较小的值(以减少行高),外观是不是很不错(尤其是当编辑)。我们是否有任何解决方法的方式吗?
AlanW
评论会员:游客 时间:2011/12/06
该项目行的高度是基于"系统消息"的字体大小-存储在m_nItemHeight(见BOOLLoadSettings()).{BR}你应该只需要调整这个值,以增加该项目的高度。
琼阮
评论会员:游客 时间:2011/12/06
感谢您的及时支持,你我想减少(不增加)项的高度。AlanW写道:你应该只需要调整这个值,以增加该项目的高度您的解决方案,在"视图"模式,但仍符合"编辑"模式的问题。这是因为编辑,组合,日期选择器控制仍然可以使用自己的字体。​​当然,我可以调整他们逐案,但如果你能支持此功能,它会帮助很多人在这里,我想。感谢。
kongh110
评论会员:游客 时间:2011/12/06
。BoundChecker说:"对象被选中到DC,DeleteObject"这件事发生在"3288线"ListCtrl.h我很困惑,CPen删除析构函数m_hPen,所以出现上述问题,但如果我改变成代码显式调用DeleteObject,程序崩溃,另一方面我尝试使用CPenHandle代替,但的BoundsChecker说,"GDI资源的内存泄漏".....所以,它应该是一个问题?
duoluoyidai
评论会员:游客 时间:2011/12/06
您好,感谢很多共享代码。请,我想问你:1。当我输入一些特殊字符/:*?|\等,然后我想用户线索,这是不允许的。,当你改变你的文件名。,现在我想使用CToolTipCtrl的窗户一样,你可以给我一个directionsbreak?2.that的进展,我想上显示的进度百分比。如何实现?等待你的回答;
AlexisAlexis
评论会员:游客 时间:2011/12/06
关于进度的位置。使用SetItemText功能,通过%作为文本字符串值。imgsrc=http://www.orcode.com/upimg/2011_12_06_08_37_14_1.gif
sniqaow
评论会员:游客 时间:2011/12/06
永远不会介意..-在17点59分2007年7月9日(星期一)修改
Vlad0
评论会员:游客 时间:2011/12/06
我使用VS2005SP1。后的解决方案是转换到VC8编译过程中出现错误。WTL7.5和WTL8这个错误的原因是清楚的:一种MSG_WM_XXXX宏只能作为一个参数一个参数的功能,而的OnTimer这里有第二个参数-TIMERPROC定时器。如果删除这个参数定义的OnTimer()(或一台默认值为NULL),其他两个错误消息出现,完全与定时器无关:"两个重载DIV()".{BR}顺便说一下,这是不是唯一的程序编译失败由于同样的原因-所有其他的演示定义的OnTimer()通过MSG_WM_TIMER宏编译失败以及只有WTLntrayDemo编译确定,但它使用MESSAGE_HANDLER宏而不是MSG_WM_TIMER来定义的OnTimer()。这里取决于4"非开裂"的论点。
eliot1949
评论会员:游客 时间:2011/12/06
无效的OnTimer(UINTnIDEvent,TIMERPROC定时器)====={BR}无效的OnTimer(UINT_PTRnIDEvent)格(A,B)==格((INT),(INT)B) 或格((长),(长)B)