本文转载自:VC驿站
https://www.cctry.com/thread-297487-1-1.html
1、控件简介:
ListCtrl 高级列表控件也是我们平时编程过程中很常用的一个控件,一般涉及到报表展示、记录展示之类的,都需要ListCtrl 高级列表控件。例如:任务管理器啊,文件列表啊,等等都是ListCtrl 高级列表控件来实现的。
2、控件的风格样式:
LVS_ICON: 为每个item显示大图标
LVS_SMALLICON: 为每个item显示小图标
LVS_LIST: 显示一列带有小图标的item
LVS_REPORT: 显示item详细资料
直观的理解:Windows资源管理器,“查看” 标签下的 “大图标,小图标,列表,详细资料”
具体可以通过代码指定控件的风格样式,也可以方便点,从控件的属性中直接修改:
对应控件的 View 属性:Icon、Small Icon、List、Report 四项。
大家看到了吧,主要就是针对这四种风格样式!
比较常用的还是第四种:报表样式!
3、动态设定 ListCtrl 的风格样式:
①、拖动ListCtrl控件到对话框界面上面;
②、绑定CListCtrl类型的控件类型变量:m_List;
③、样式设定:
LONG lStyle = 0;
lStyle = GetWindowLong(m_List.GetSafeHwnd(), GWL_STYLE);//获取当前窗口样式
lStyle &= ~LVS_TYPEMASK; //清除显示掩码
lStyle |= LVS_REPORT; //设置报表样式
SetWindowLong(m_List.GetSafeHwnd(), GWL_STYLE, lStyle);//设置新样式
我们教程中重点讲解 LVS_REPORT 报表样式的 ListCtrl,其他风格,大家课后自行研究吧,网上也有不少这方面的文章!
4、动态设定 ListCtrl 的扩展风格:
DWORD dwStyle = m_List.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT; //选中某行使整行高亮(只适用于Report风格)
dwStyle |= LVS_EX_GRIDLINES; //网格线(只适用于Report风格)
dwStyle |= LVS_EX_CHECKBOXES; //item 前生成 CheckBox 复选框
//dwStyle |= LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_CHECKBOXES;
m_List.SetExtendedStyle(dwStyle); //设置扩展风格
5、插入列信息:
使用 InsertColumn 插入列信息:
m_List.InsertColumn(0, _T("列1"), LVCFMT_LEFT, 50);
m_List.InsertColumn(1, _T("列2"), LVCFMT_LEFT, 50);
m_List.InsertColumn(2, _T("列3"), LVCFMT_LEFT, 50);
InsertColumn 各个参数的讲解,详见视频教程!
6、插入行信息:
m_List.InsertItem(m_List.GetItemCount(), _T("111"));
m_List.InsertItem(m_List.GetItemCount(), _T("222"));
m_List.InsertItem(m_List.GetItemCount(), _T("333"));
InsertItem 各个参数的讲解,详见视频教程!
7、设置行文本信息:
m_List.SetItemText(0, 1, _T("aaa"));
m_List.SetItemText(0, 2, _T("bbb"));
m_List.SetItemText(1, 1, _T("ccc"));
m_List.SetItemText(1, 2, _T("ddd"));
8、选中和取消选中一行:
int nIndex = 0;
//选中
m_List.SetFocus(); //这句别忘了,不然不能高亮
m_List.SetItemState(nIndex, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
//取消选中
m_List.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);
9、遍历控件的所有行条目:
int nCount = m_List.GetItemCount();
for (int idx = 0; idx < nCount; ++idx)
{
CString strText = m_List.GetItemText(idx, 0);
strText = m_List.GetItemText(idx, 1);
strText = m_List.GetItemText(idx, 2);
}
10、遍历获得当前选中的行:
POSITION pos = m_List.GetFirstSelectedItemPosition();
while (pos)
{
int nItem = m_List.GetNextSelectedItem(pos);
}
大家课后找资料,看看如何能根据第9点的遍历方式,获得当前选中的行号!
11、遍历获得当前CheckBox选中的行:
int nCount = m_List.GetItemCount();
for (int idx = 0; idx < nCount; ++idx)
{
BOOL bCheck = m_List.GetCheck(idx);
if (bCheck)
{
CString strText;
strText.Format(_T("第%d行被勾选了!"), idx);
MessageBox(strText);
}
}
12、删除行:
删除指定的行:m_List.DeleteItem(1);
删除所有的行:m_List.DeleteAllItems();
大家课后试试:如果我想删除列表控件中索引为0和2的行,怎么删除呢?大家试试
用for循环的话,如何来写代码呢?大家课后试试!
13、编辑指定的行文本:(其实这个跟之前讲解的TreeCtrl很像)
①、将ListCtrl控件的 Edit Labels 设置为 True;
②、响应ListCtrl控件的 LVN_BEGINLABELEDIT 和 LVN_ENDLABELEDIT
③、在 LVN_ENDLABELEDIT 响应函数中加入:
NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
m_List.SetItemText(pDispInfo->item.iItem, pDispInfo->item.iSubItem, pDispInfo->item.pszText);
备注:这里只能编辑(索引为0的)第1列的文本,其他列的没办法编辑,要想编辑也不是不能,就得自己来搞了!
其实有很多写好的开源控件类,大家直接拿过来用就可以了,多了很多功能。
14、插入图标:跟树形控件 TreeCtrl 的用法基本一致,算是给大家留一个小作业了,自己搞定吧!
15、开源控件类:
https://www.codeproject.com/Arti ... ontrol-with-subitem
https://www.codeproject.com/Arti ... that-allows-other-c
https://www.codeproject.com/Arti ... l-and-Grouping-Rows
https://www.codeproject.com/Arti ... er-listview-control
https://www.codeproject.com/Arti ... ewer-using-ListCtrl
https://www.codeproject.com/Arti ... ient-version-of-rep
https://www.codeproject.com/Articles/3495/Registry-List-Control
https://www.codeproject.com/Arti ... operty-List-Control
https://www.codeproject.com/Arti ... it-individual-cells
https://www.codeproject.com/Arti ... i-line-List-Control
https://www.codeproject.com/Arti ... -Based-on-CListCtrl
https://www.codeproject.com/Arti ... istCtrl-Give-user-a
16、再来个小作业:
如何让CListCtrl选中行始终保持其蓝色高亮状态,即使在失去焦点的时候?
具体操作细节见视频教程的演示和讲解!
第16课免费试看,下载地址: