ListControl控件的使用方法

2024-08-23 04:08

本文主要是介绍ListControl控件的使用方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

列表控件可以看作是功能增强的ListBox,它提供了四种风格,而且可以同时显
示一列的多种属性值。MFC中使用CListCtrl类来封装列表控件的各种操作。通
过调用BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd,
UINT nID );创建一个窗口,dwStyle中可以使用以下一些列表控件的专用风格
: LVS_ICON ,LVS_SMALLICON ,LVS_LIST, LVS_REPORT 这四种风格决定控件的外观,同时只可以选择其中一种,分别对应:大图标显示,小图标显示,列表显
示,详细报表显示。

LVS_EDITLABELS 结点的显示字符可以被编辑,对于报表风格来讲可编辑的只为

第一列。
LVS_SHOWSELALWAYS 在失去焦点时也显示当前选中的结点
LVS_SINGLESEL 同时只能选中列表中一项


首先你需要设置列表控件所使用的ImageList,如果你使用大图标显示风格,你

就需要以如下形式调用:
CImageList* SetImageList( CImageList* pImageList, LVSIL_NORMAL);
如果使用其它三种风格显示而不想显示图标你可以不进行任何设置,
否则需要以如下形式调用:
CImageList* SetImageList( CImageList* pImageList, LVSIL_SMALL);
int InsertItem( int nItem, LPCTSTR lpszItem ); 插入行
nItem:指明插入位置
lpszItem:为显示字符。


除LVS_REPORT风格外其他三种风格都只需要直接调用InsertItem就可以了,但

如果使用报表风格就必须先设置列表控件中的列信息。
int InsertColumn( int nCol, LPCTSTR lpszColumnHeading, int nFormat ,

int nWidth, int nSubItem); 插入列
iCol:为列的位置,从零开始
lpszColumnHeading:为显示的列名
nFormat:为显示对齐方式
nWidth:为显示宽度
nSubItem:为分配给该列的列索引。

BOOL SetItemText( int nItem, int nSubItem, LPTSTR lpszText );设置每列

的显示字符
nItem:为行位置
nSubItem:为列位置
lpszText:为显示字符

下面的代码演示了如何设置多列并插入数据:
m_list.SetImageList(&m_listSmall,LVSIL_SMALL);//设置ImageList
m_list.InsertColumn(0,"Col 1",LVCFMT_LEFT,300,0);//设置列
m_list.InsertColumn(1,"Col 2",LVCFMT_LEFT,300,1);
m_list.InsertColumn(2,"Col 3",LVCFMT_LEFT,300,2);
m_list.InsertItem(0,"Item 1_1");//插入行
m_list.SetItemText(0,1,"Item 1_2");//设置该行的不同列的显示字符
m_list.SetItemText(0,2,"Item 1_3")

COLORREF GetTextColor( )/BOOL SetTextColor( COLORREF cr ):用于得到/

设置显示的字符颜色。
COLORREF GetTextBkColor( )/BOOL SetTextBkColor( COLORREF cr ):用于得

到/设置显示的背景颜色。
void SetItemCount( int iCount ):用于得到添加进列表中项的数量。
BOOL DeleteItem(int nItem):用于删除某一项
BOOL DeleteAllItems( ):将删除所有项。
BOOL SetBkImage(HBITMAP hbm, BOOL fTile , int xOffsetPercent, int

yOffsetPercent):用于设置背景位图。
CString GetItemText( int nItem, int nSubItem ):用于得到某项的显示字

符。

列表控件的消息映射同样使用ON_NOTIFY宏,形式如同:
ON_NOTIFY( wNotifyCode, id, memberFxn ),
wNotifyCode为通知代码,id为产生该消息的窗口ID,memberFxn为处理函数,
函数的原型如同void OnXXXList(NMHDR* pNMHDR, LRESULT* pResult),
其中pNMHDR为一数据结构,在具体使用时需要转换成其他类型的结构。


对于列表控件可能取值和对应的数据结构为:
LVN_BEGINLABELEDIT 在开始某项编辑字符时发送,所用结构:NMLVDISPINFO
LVN_ENDLABELEDIT 在结束某项编辑字符时发送,所用结构:NMLVDISPINFO
LVN_GETDISPINFO 在需要得到某项信息时发送,(如得到某项的显示字符)所

用结构:NMLVDISPINFO
关于ON_NOTIFY有很多内容,将在以后的内容中进行详细讲解。




关于动态提供结点所显示的字符:
首先你在项时需要指明lpszItem参数为:LPSTR_TEXTCALLBACK。
在控件显示该结点时会通过发送TVN_GETDISPINFO来取得所需要的字符,在处理

该消息时先将参数pNMHDR转换为LPNMLVDISPINFO,然后填充其中item.pszText
。通过item中的iItem,iSubItem可以知道当前显示的为哪一项。

下面的代码演示了这种方法:
char szOut[8][3]={"No.1","No.2","No.3"};
//添加结点
m_list.InsertItem(LPSTR_TEXTCALLBACK,...)
m_list.InsertItem(LPSTR_TEXTCALLBACK,...)
//处理消息
void CParentWnd::OnGetDispInfoList(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pLVDI = (LV_DISPINFO*)pNMHDR;
pLVDI->item.pszText=szOut[pTVDI->item.iItem];
//通过iItem得到需要显示的字符在数组中的位置
*pResult = 0;
}

关于编辑某项的显示字符:(在报表风格中只对第一列有效)首先需要设置列

表控件的LVS_EDITLABELS风格,在开始编辑时该控件将会发送
LVN_BEGINLABELEDIT,你可以通过在处理函数中返回TRUE来取消接下来的编辑,在编辑完成后会发送LVN_ENDLABELEDIT,在处理该消息时需要将参数pNMHDR转换为LPNMLVDISPINFO,然后通过其中的item.pszText得到编辑后的字符,并重置显示字符。如果编辑在中途中取消该变量为NULL。

下面的代码说明如何处理这些消息:
//处理消息 LVN_BEGINLABELEDIT
void CParentWnd::OnBeginEditList(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pLVDI = (LV_DISPINFO*)pNMHDR;
if(pLVDI->item.iItem==0);//判断是否取消该操作
*pResult = 1;
else
*pResult = 0;
}
//处理消息 LVN_BEGINLABELEDIT
void CParentWnd::OnBeginEditList(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pLVDI = (LV_DISPINFO*)pNMHDR;
if(pLVDI->item.pszText==NULL);//判断是否已经取消取消编辑
m_list.SetItemText(pLVDI->item.iItem,0,pLVDI->pszText);
//重置显示字符
*pResult = 0;
}
上面讲述的方法所进行的消息映射必须在父窗口中进行(同样WM_NOTIFY的所有

消息都需要在父窗口中处理)。
如何得到当前选中项位置:在列表控件中没有一个类似于ListBox中GetCurSel
()的函数,但是可以通过调用GetNextItem( -1, LVNI_ALL | LVNI_SELECTED);得到选中项位置。

list control控件中的风格选项:
m_list1.SetExtendedStyle(

LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES );
LVS_EX_FULLROWSELECT表示可以点中行中的任意一个列选中这一条记录
LVS_EX_GRIDLINES表示列之间有分隔符号
LVS_EX_CHECKBOXES 表示每一行第一列是checkbox
LVCOLUMN:listviewcolumn
设置表头
lvColumn.mask = LVCF_SUBITEM|LVCF_TEXT|LVCF_WIDTH|LVCF_FMT; 设置表头

风格
lvColumn.fmt = LVCFMT_CENTER; 设置表头对齐方式
lvColumn.iSubItem = i; 表头列序
lvColumn.pszText = HeaderTxt; 表头名称
lvColumn.cx = 90; 表头宽度
m_list.InsertColumn(i,&lvColumn); 插入列

这篇关于ListControl控件的使用方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1098306

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程