VC++ 中ListCtrl经验总结
文件大小: 78k
源码售价: 10 个金币 积分规则     积分充值
资源说明:在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文档和其他资源,了解更多高级特性和用法。
本源码包内暂不包含可直接显示的源代码文件,请下载源码包。