ClistCtrl

原文出处忘了

1. 关于带 chexbox 和图像的 CListCtrl

(1)设置具有chexbox风格的属性

//设置比较站风格、、、
LONG lCompareStyle;
lCompareStyle = GetWindowLong(m_ComparePoc.m_hWnd, GWL_STYLE);//获取当前窗口style
lCompareStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
m_ComparePoc.SetExtendedStyle(lCompareStyle); //设置扩展风格


其中的m_ComparePoc是view为SmalIcon的clistCtrl对象。
(2)添加图像

m_imageList.Create(16, 16, ILC_COLOR16|ILC_MASK, 1, 1);
m_imageList.Add(AfxGetApp()->LoadIcon(IDI_ICON_POC));
m_ComparePoc.SetImageList(&m_imageList,LVSIL_SMALL);


其中的m_imageList为CImageList的对象IDI_ICON_POC为资源中的一个ICON的ID。
(3)检查是否被选择

m_ComparePoc.GetCheck(i)


如果被选择则会返回真,否则为假。
(4)选择
m_ComparePoc.GetCheck(i)

m_ComparePoc.GetCheck(i)


置为选择状态,如果是选择的话,此函数也不会出错。

 


2. 关于 reportreport 的 clistCtrl

第三方控件的CReportCtrl类。
(1)设置风格的属性
//设置比较内容显示风格、、、
LONG lCompareShowStyle;
lCompareShowStyle = GetWindowLong(m_CompareShow.m_hWnd, GWL_STYLE);//获取当前窗口style
lCompareShowStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)
lCompareShowStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl)
m_CompareShow.SetExtendedStyle(lCompareShowStyle); //设置扩展风格


(2)单元格背景色设置

m_CompareShow.SetItemBkColor(j,i+1,RGB(255,0,0), FALSE); 


其中的j和i+1和CListCtrl一样,都是从零开始的,FALSE表示不刷新整个控件,否则刷新整个控件。
(3)删除所有列

 m_CompareShow.DeleteAllColumns();


其中只是删除表头。
(4)删除所有的行 

 m_CompareShow.CListCtrl::DeleteAllItems();


这里调用CListCtrl的DeleteAllItems函数,而不是CReportCtrl里重载的DeleteAllItems函数
因为此函数会造成整个对话框的刷新和屏幕背景的刷新(原因未知,具体可查看源码)

CReportCtrl类http://download.youkuaiyun.com/detail/wuyuan2011woaini/5991311

### CListCtrl 使用指南及常见问题解决方案 `CListCtrl` 是 MFC 提供的一个用于显示列表视图的控件,支持多种显示模式(如报告模式、图标模式等),并可以处理大量数据。以下是 `CListCtrl` 的基本使用方法及其常见问题的解决方案。 --- #### 1. 创建和初始化 `CListCtrl` 可以通过资源编辑器创建一个静态控件并将类关联到变量,或者动态创建它。如果需要自定义行为,则通常会在对话框或视图中声明一个 `CListCtrl` 对象,并将其附加到窗口句柄。 ```cpp // 动态创建 CListCtrl 示例 RECT rect = {10, 10, 200, 300}; m_ListCtrl.Create(WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_EDITLABELS, rect, this, IDC_LIST_CTRL); ``` 此处设置了样式为 `LVS_REPORT` 表示报告模式[^5],其他常用样式包括: - `LVS_ICON`: 图标模式。 - `LVS_SMALLICON`: 小图标模式。 - `LVS_LIST`: 列表模式。 --- #### 2. 插入列和项目 在报告模式下,必须先插入列再插入行数据。 ```cpp // 插入列 m_ListCtrl.InsertColumn(0, _T("Name"), LVCFMT_LEFT, 150); m_ListCtrl.InsertColumn(1, _T("Age"), LVCFMT_CENTER, 80); // 插入行 LVITEM item; item.mask = LVIF_TEXT; item.iItem = 0; item.iSubItem = 0; item.pszText = _T("John Doe"); m_ListCtrl.InsertItem(&item); item.iSubItem = 1; item.pszText = _T("28"); m_ListCtrl.SetItem(&item); ``` 每行列数需匹配之前设置的列数,否则可能导致异常。 --- #### 3. 设置图像列表 为了增强视觉效果,可将图片绑定至每一项。 ```cpp // 初始化图像列表 CImageList imageList; imageList.Create(16, 16, ILC_COLOR32, 2, 1); HBITMAP hBmp = LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1)); imageList.Add(hBmp); // 关联到 ListCtrl m_ListCtrl.SetImageList(&imageList, LVSIL_NORMAL); ``` 对于小图标模式下的图片集合,应指定参数为 `LVSIL_SMALL`。 --- #### 4. 处理事件通知 当用户交互时触发的消息可通过映射函数捕获。 ```cpp BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx) ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_CTRL, &CMyDialog::OnItemChanged) END_MESSAGE_MAP() void CMyDialog::OnItemChanged(NMHDR* pNMHDR, LRESULT* pResult) { LPNMLISTVIEW pItemChanged = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); if (pItemChanged->uNewState & LVIS_SELECTED) { // 用户选择了某一项 } } ``` 此代码片段展示了如何响应选中状态变化的通知。 --- #### 5. 常见问题与解决办法 ##### **问题 1**: 数据无法正常更新? **原因分析**: 如果未刷新界面,即使调用了 `SetItem` 方法也可能看不到最新内容。 **解决方案**: 显式调用 `RedrawItems` 或者重新绘制整个控件。 ```cpp m_ListCtrl.RedrawItems(startIndex, endIndex); ``` ##### **问题 2**: 删除所有条目失败? **建议操作**: 清空前确认清除了子项以及可能存在的缓存。 ```cpp m_ListCtrl.DeleteAllItems(); if (m_ImageList != nullptr && m_ImageList.GetSafeHandle()) { m_ImageList.Destroy(); } ``` ##### **问题 3**: 自定义排序逻辑不生效? **调整方式**: 实现比较回调函数并与控件挂钩。 ```cpp int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { CString str1 = ((CMyClass*)lParam1)->GetStringValue(); CString str2 = ((CMyClass*)lParam2)->GetStringValue(); return str1.CompareNoCase(str2); } m_ListCtrl.SortItems(CompareFunc, NULL); ``` --- ### 总结 通过上述介绍可以看出,掌握好基础属性配置、事件监听机制以及调试技巧能够极大提升开发效率。同时注意清理不再使用的资源以免造成内存泄漏等问题发生。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值