资源说明:在VC++编程中,CListCtrl是一个非常重要的控件,常用于显示数据列表,它提供了多种视图模式,包括报告视图(Report View)、小图标视图、大图标视图等。本文将重点介绍在报告视图中的CListCtrl使用技巧,特别是如何设置风格、添加列头、插入数据以及插入图标。
**条款一:设置ListCtrl的风格**
在CListCtrl中,可以通过设置窗口样式和扩展样式来改变其外观和行为。例如,要实现整行选中、网格线和复选框,可以使用以下代码:
```cpp
// 获取原有风格
DWORD dwStyle = ::GetWindowLong(m_listctrl.m_hWnd, GWL_STYLE);
dwStyle &= ~(LVS_TYPEMASK);
dwStyle &= ~(LVS_EDITLABELS);
// 设置新风格
SetWindowLong(m_listctrl.m_hWnd, GWL_STYLE, dwStyle | LVS_REPORT | LVS_NOLABELWRAP | LVS_SHOWSELALWAYS);
// 设置扩展风格
DWORD styles = LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_CHECKBOXES;
ListView_SetExtendedListViewStyleEx(m_listctrl.m_hWnd, styles, styles);
```
这里,`LVS_REPORT` 表示报告视图,`LVS_NOLABELWRAP` 防止文本换行,`LVS_SHOWSELALWAYS` 使选中项始终保持可见,`LVS_EX_FULLROWSELECT` 实现整行选中,`LVS_EX_GRIDLINES` 添加网格线,`LVS_EX_CHECKBOXES` 在列表项前显示复选框。
**条款二:加入列头**
列头的创建是通过插入列来实现的,以下代码展示了如何插入两列:
```cpp
TCHAR rgtsz[2][10] = {_T("列头1"), _T("列头2")};
LV_COLUMN lvcolumn;
CRect rect;
m_listctrl.GetWindowRect(&rect);
for (int i = 0; i < 2; i++) {
lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH | LVCF_ORDER;
lvcolumn.fmt = LVCFMT_LEFT;
lvcolumn.pszText = rgtsz[i];
lvcolumn.iSubItem = i;
lvcolumn.iOrder = i;
if (i == 0) {
lvcolumn.cx = rect.Width() * 3 / 5;
} else {
lvcolumn.cx = rect.Width() * 2 / 5;
}
m_listctrl.InsertColumn(i, &lvcolumn);
}
```
`LV_COLUMN` 结构体用于定义列的属性,`LVCFMT_LEFT` 指定文本左对齐,`pszText` 存储列头文本,`iSubItem` 和 `iOrder` 分别为子项索引和顺序,`cx` 定义列的宽度。
**条款三:把记录插入列表框中**
向列表框中插入数据通常涉及创建 `LV_ITEM` 结构体,并调用 `InsertItem` 和 `SetItem` 函数。以下代码插入一行数据:
```cpp
int nIndex = m_listctrl.GetItemCount();
LV_ITEM lvitemAdd = {0};
lvitemAdd.mask = LVIF_TEXT;
lvitemAdd.iItem = nIndex ;
lvitemAdd.iSubItem = 0;
lvitemAdd.pszText = _T("毛毛1");
if (m_listctrl.InsertItem(&lvitemAdd) != -1) {
LV_ITEM lvitem = {0};
lvitem.mask = LVIF_TEXT;
lvitem.iItem = nIndex ;
lvitem.iSubItem = 1;
lvitem.pszText = _T("毛毛2");
m_listctrl.SetItem(&lvitem);
}
```
`InsertItem` 用于插入新的列表项,`SetItem` 用于设置已插入项的其他属性。
**条款四:给列表中插入图标**
要插入图标,首先需要设置 `LVS_EX_SUBITEMIMAGES` 扩展风格,然后通过 `SetImageList` 函数设置图像列表:
```cpp
// 创建图像列表
CImageList imageList;
imageList.Create(16, 16, ILC_COLOR24, 2, 0);
// 加载图标
HICON hIcon1 = LoadIcon(NULL, IDI_APPLICATION);
HICON hIcon2 = LoadIcon(NULL, IDI_QUESTION);
imageList.Add(hIcon1, RGB(0, 0, 0));
imageList.Add(hIcon2, RGB(0, 0, 0));
// 将图像列表设置给ListCtrl
m_listctrl.SetImageList(imageList, LVSIL_SMALL);
// 插入带有图标的项
LV_ITEM lvitem = {0};
lvitem.mask = LVIF_IMAGE | LVIF_TEXT;
lvitem.iItem = nIndex;
lvitem.iSubItem = 0;
lvitem.pszText = _T("带有图标的项");
lvitem.iImage = 0; // 图标索引
m_listctrl.InsertItem(&lvitem);
```
通过 `iImage` 字段,我们可以指定每个列表项所对应的图标索引。
CListCtrl在VC++中是一个功能强大的控件,通过设置不同的风格和操作,可以实现各种自定义的列表展示效果。理解并熟练掌握这些基本操作,对于开发高效且用户友好的界面至关重要。在实际应用中,还可以结合MSDN文档和其他资源,了解更多高级特性和用法。
本源码包内暂不包含可直接显示的源代码文件,请下载源码包。