CListCTrl 使用技巧--补充

CListCTrl 使用技巧--补充

listctrl内容进行大数据量更新时,避免闪烁
      m_list.SetRedraw(FALSE);
      //更新内容
      m_list.SetRedraw(TRUE);
      m_list.Invalidate();
      m_list.UpdateWindow();
 
或者参考

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_mfc_cwnd.3a3a.setredraw.asp
--------------------------------------------------------------------------------

listctrl排序

Q250614:How To Sort Items in a CListCtrl in Report View
http://support.microsoft.com/kb/250614/en-us

--------------------------------------------------------------------------------

在listctrl中选中某个item时动态改变其icon或bitmap

Q141834: How to change the icon or the bitmap of a CListCtrl item in Visual C++
http://support.microsoft.com/kb/141834/en-us

--------------------------------------------------------------------------------

在添加item后,再InsertColumn()后导致整列数据移动的问题

Q151897: CListCtrl::InsertColumn() Causes Column Data to Shift
http://support.microsoft.com/kb/151897/en-us
--------------------------------------------------------------------------------

关于listctrl第一列始终居左的问题
解决办法:把第一列当一个虚列,从第二列开始插入列及数据,最后删除第一列。
     
具体解释参阅  
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/listview/structures/lvcolumn.asp
--------------------------------------------------------------------------------

锁定column header的拖动
http://msdn.microsoft.com/msdnmag/issues/03/06/CQA/
--------------------------------------------------------------------------------

如何隐藏clistctrl的列
    把需隐藏的列的宽度设为0,然后检测当该列为隐藏列时,用上面第27点的锁定column 的拖动来实现
--------------------------------------------------------------------------------

listctrl进行大数据量操作时,使用virtual list   
http://www.codeguru.com/cpp/controls/listview/advanced/article.php/c4151/
http://www.codeproject.com/listctrl/virtuallist.asp
--------------------------------------------------------------------------------

关于item只能显示259个字符的问题

解决办法:需要在item上放一个edit。
--------------------------------------------------------------------------------

响应在listctrl的column header上的鼠标右键单击
Q125694: How To Find Out Which Listview Column Was Right-Clicked
http://support.microsoft.com/kb/125694/en-us
--------------------------------------------------------------------------------

类似于windows资源管理器的listview

Q234310: How to implement a ListView control that is similar to Windows Explorer by using DirLV.exe
http://support.microsoft.com/kb/234310/en-us
--------------------------------------------------------------------------------

以下为一些为实现各种自定义功能的listctrl派生类

(1) 拖放       
http://www.codeproject.com/listctrl/dragtest.asp

在CListCtrl和CTreeCtrl间拖放
http://support.microsoft.com/kb/148738/en-us
 
(2) 多功能listctrl
支持subitem可编辑,图标,radiobutton,checkbox,字符串改变颜色的类
http://www.codeproject.com/listctrl/quicklist.asp
 
支持排序,subitem可编辑,subitem图标,subitem改变颜色的类
                  
http://www.codeproject.com/listctrl/ReportControl.asp

(3)    subitem中显示超链接
                  
http://www.codeproject.com/listctrl/CListCtrlLink.asp

(4)    subitem的tooltip提示
                  
http://www.codeproject.com/listctrl/ctooltiplistctrl.asp

(5)    subitem中显示进度条   
                  
http://www.codeproject.com/listctrl/ProgressListControl.asp
http://www.codeproject.com/listctrl/napster.asp
                   http://www.codeguru.com/Cpp/controls/listview/article.php/c4187/

(6)    动态改变subitem的颜色和背景色
                   
http://www.codeproject.com/listctrl/highlightlistctrl.asp
                    http://www.codeguru.com/Cpp/controls/listbox/colorlistboxes/article.php/c4757/
 
(7)    类vb属性对话框
                   
http://www.codeproject.com/listctrl/propertylistctrl.asp
                    http://www.codeguru.com/Cpp/controls/listview/propertylists/article.php/c995/
                   
http://www.codeguru.com/Cpp/controls/listview/propertylists/article.php/c1041/
 
(8)    选中subitem(只高亮选中的item)
                   
http://www.codeproject.com/listctrl/SubItemSel.asp
                    http://www.codeproject.com/listctrl/ListSubItSel.asp
 
(9)    改变行高
                   
http://www.codeproject.com/listctrl/changerowheight.asp
 
(10)   改变行颜色
                   
http://www.codeproject.com/listctrl/coloredlistctrl.asp
 
(11)   可编辑subitem的listctrl
http://www.codeproject.com/listctrl/nirs2000.asp
                    http://www.codeproject.com/listctrl/editing_subitems_in_listcontrol.asp
 
(12)   subitem可编辑,插入combobox,改变行颜色,subitem的tooltip提示
                   
http://www.codeproject.com/listctrl/reusablelistcontrol.asp
 
(13)   header 中允许多行字符串
                   
http://www.codeproject.com/listctrl/headerctrlex.asp
 
(14)   插入combobox
                   
http://www.codeguru.com/Cpp/controls/listview/editingitemsandsubitem/article.php/c979/
 
(15)   添加背景图片
                   
http://www.codeguru.com/Cpp/controls/listview/backgroundcolorandimage/article.php/c4173/
                    http://www.codeguru.com/Cpp/controls/listview/backgroundcolorandimage/article.php/c983/
                    http://www.vchelp.net/vchelp/archive.asp?type_id=9&class_id=1&cata_id=1&article_id=1088&search_term=
   
(16)  自适应宽度的listctrl
                   
http://www.codeproject.com/useritems/AutosizeListCtrl.asp

 

 

<think>根据用户问题,用户想了解如何在MFCCListCtrl使用SetItemData方法,并且需要示例。结合用户之前的上下文(关于double转wstring的问题已经解决),现在聚焦于CListCtrl的SetItemData。**关键点说明:**1.**SetItemData作用**:为列表控件中的每个项(item)关联一个32位的自定义据(DWORD_PTR)。通常用于存储与该项相关的唯一标识符或指针。2.**典型应用场景**:在虚拟列表控件中快速检索据,或在处理选择项时获取关联据。**步骤:**1.添加项到CListCtrl后,调用SetItemData设置据。2.通过GetItemData检索据。**示例:**创建一个学生信息列表,每行显示学生姓名,但关联的据是学生ID(假设为整)。```cpp//假设m_list是CListCtrl控件变量m_list.InsertColumn(0,_T("姓名"),LVCFMT_LEFT,100);//创建列//添加行并设置关联据intnItem=m_list.InsertItem(0,_T("张三"));//插入第一行,返回索引m_list.SetItemData(nItem,10001);//将学号10001与该项关联nItem=m_list.InsertItem(1,_T("李四"));m_list.SetItemData(nItem,10002);//当需要获取选中行的关联据时:intnSelect=m_list.GetNextItem(-1,LVNI_SELECTED);//获取第一个选中项索引if(nSelect!=-1){DWORD_PTRdwData=m_list.GetItemData(nSelect);//获取关联据CStringstrMsg;strMsg.Format(_T("选中项的学生ID是:%lu"),dwData);AfxMessageBox(strMsg);}```**注意事项:**-关联据可以是任意32位值(指针需注意生命周期)。-虚拟列表控件中,SetItemData通常用于存储据索引[^4]。-确保据在项的生命周期内有效。---§§相关问题§§1.如何为CListCtrl的项关联指针类型据?2.使用SetItemData后如何更新关联据?3.CListCtrl的虚拟模式与SetItemData有什么关系?---以上内容参考了引用[4]中关于SetItemData用于排序索引的示例,以及引用[2][3]中遍历选中项的方法。</think> ### MFC CListCtrl `SetItemData` 使用方法详解 `SetItemData` 是 `CListCtrl` 的关键方法,用于为列表中的每个项关联自定义据(DWORD 值),通常用于存储项的唯一标识符或指针。 #### 核心功能说明 1. **据关联** 将32位值(整或指针)与特定列表项绑定 $$ \text{SetItemData}(nItem, dwData) \rightarrow \text{Item}_{nItem} \leftrightarrow dwData $$ 2. **据检索** 通过 `GetItemData` 获取关联据 3. **应用场景** - 存储据库主键 - 保存对象指针 - 维护选中项状态 - 排序索引绑定[^4] --- #### 完整使用示例 ```cpp // 初始化列表控件 m_listCtrl.InsertColumn(0, _T("文件名"), LVCFMT_LEFT, 200); m_listCtrl.InsertColumn(1, _T("大小"), LVCFMT_RIGHT, 100); // 添加项并关联据 int addFileToList(LPCTSTR filename, DWORD fileSize, DWORD fileID) { int nItem = m_listCtrl.InsertItem(0, filename); // 插入新项 CString sizeStr; sizeStr.Format(_T("%d KB"), fileSize / 1024); // 设置子项文本 m_listCtrl.SetItemText(nItem, 1, sizeStr); // 关联自定义据 (文件ID) m_listCtrl.SetItemData(nItem, fileID); return nItem; } // 使用示例 addFileToList(_T("report.doc"), 245760, 1001); // 文件ID=1001 addFileToList(_T("budget.xlsx"), 512000, 1002); // 文件ID=1002 // 获取选中项关联据 void OnItemSelected() { POSITION pos = m_listCtrl.GetFirstSelectedItemPosition(); while (pos) { int nItem = m_listCtrl.GetNextSelectedItem(pos); // 检索关联据 DWORD fileID = m_listCtrl.GetItemData(nItem); CString msg; msg.Format(_T("选中文件ID: %d"), fileID); AfxMessageBox(msg); } } // 更新关联据 (示例修改文件ID) void UpdateItemData(int nItem, DWORD newID) { m_listCtrl.SetItemData(nItem, newID); // 更新关联值 } ``` #### 关键注意事项 1. **据生命周期** 关联指针时需确保对象在列表项存在期间有效 2. **排序处理** 排序时需重建据关联(参考引用[4]): ```cpp // 排序后重建索引关联 for(int i=0; i < m_listCtrl.GetItemCount(); i++) m_listCtrl.SetItemData(i, i); ``` 3. **据范围** `DWORD` 为32位值,64位指针需强制转换: ```cpp // 关联指针 auto* pObj = new MyObject(); m_listCtrl.SetItemData(nItem, reinterpret_cast<DWORD_PTR>(pObj)); // 获取指针 auto* pRetrieved = reinterpret_cast<MyObject*>(m_listCtrl.GetItemData(nItem)); ``` --- #### 典型应用场景 1. **选中项处理**(参考引用[2][3]) ```cpp int nSelect = m_listCtrl.GetNextItem(-1, LVNI_SELECTED); if(nSelect != -1) { DWORD data = m_listCtrl.GetItemData(nSelect); // 处理关联据 } ``` 2. **批量操作选中项** ```cpp POSITION pos = m_listCtrl.GetFirstSelectedItemPosition(); while(pos) { int nItem = m_listCtrl.GetNextSelectedItem(pos); DWORD id = m_listCtrl.GetItemData(nItem); // 处理每个选中项 } ``` 3. **复制据到剪贴板**(参考引用[3]) 结合关联据实现高级导出功能 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Blue_Dream_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值