《2022年CListCtrl使用技巧大全 .pdf》由会员分享,可在线阅读,更多相关《2022年CListCtrl使用技巧大全 .pdf(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、CListCtrl使用技巧1. CListCtrl 风格 . 22. 设置 listctrl 风格及扩展风格. 23. 插入数据 . 34. 一直选中 item . 35. 选中和取消选中一行. 36. 得到 listctrl 中所有行的checkbox 的状态 . 37. 得到 listctrl 中所有选中行的序号. 48. 得到 item 的信息 . 49. 得到 listctrl 的所有列的header 字符串内容 . 510. 使 listctrl 中一项可见,即滚动滚动条. 511. 得到 listctrl 列数 . 612. 删除所有列 . 613. 得到单击的listctrl 的
2、行列号 . 614. 判断是否点击在listctrl 的 checkbox 上 . 715. 右键点击listctrl 的 item 弹出菜单 . 816. item 切换焦点时 (包括用键盘和鼠标切换item 时),状态的一些变化顺序. 817. 得到另一个进程里的listctrl 控件的 item 内容 . 918. 选中 listview 中的 item . 10 19. 如何在 CListView 中使用 CListCtrl的派生类 . 10 20. listctrl 的 subitem 添加图标 . 10 21. 在 CListCtrl 显示文件,并根据文件类型来显示图标 . 10
3、22. listctrl 内容进行大数据量更新时,避免闪烁. 13 23. listctrl 排序 . 13 24. 在 listctrl 中选中某个item 时动态改变其icon 或 bitmap . 14 25. 在添加 item 后,再 InsertColumn() 后导致整列数据移动的问题 . 14 26. 关于 listctrl 第一列始终居左的问题. 14 27. 锁定 column header 的拖动 . 14 28. 如何隐藏clistctrl 的列 . 15 29. listctrl 进行大数据量操作时,使用virtual list . 15 30. 关于 item 只能显
4、示259 个字符的问题 . 15 31. 响应在 listctrl 的 column header 上的鼠标右键单击 . 15 32. 类似于 windows 资源管理器的listview . 16 33. 在 ListCtrl 中 OnTimer 只响应两次的问题 . 16 34. 以下为一些为实现各种自定义功能的listctrl 派生类 . 16 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 18 页 - - - - - - - - - 以下未经说明, listct
5、rl默认 view 风格为 report 1. CListCtrl 风格 LVS_ICON: 为每个 item 显示大图标 LVS_SMALLICON: 为每个 item 显示小图标 LVS_LIST: 显示一列带有小图标的item LVS_REPORT: 显示 item 详细资料直观的理解:windows资源管理器,“查看”标签下的“大图标, 小图标,列表,详细资料”2. 设置 listctrl 风格及扩展风格 LONG lStyle; lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);/获取当前窗口style lStyle &= LVS_TY
6、PEMASK; /清除显示方式位 lStyle |= LVS_REPORT; /设置 style SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);/设置 style DWORD dwStyle = m_list.GetExtendedStyle(); dwStyle |= LVS_EX_FULLROWSELECT;/选中某行使整行高亮(只适用与report风格的 listctrl) dwStyle |= LVS_EX_GRIDLINES;/网格线(只适用与report风格的listctrl) dwStyle |= LVS_EX_CHECKBOXE
7、S;/item前生成 checkbox 控件 m_list.SetExtendedStyle(dwStyle); /设置扩展 风格注:listview的 style请查阅 msdn http:/ - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 18 页 - - - - - - - - - 3. 插入数据 m_list.InsertColumn( 0, ID, LVCFMT_LEFT, 40 );/插入列 m_list.InsertColumn( 1, NAME, LVCFMT_LEFT
8、, 50 ); int nRow = m_list.InsertItem(0, “11”);/插入行m_list.SetItemText(nRow, 1, “jacky ”);/设置数据4. 一直选中 item 选中 style中的 Show selection always,或者在上面第2 点中设置LVS_SHOWSELALWAYS 5. 选中和取消选中一行 int nIndex = 0; /选中 m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED); /取消选中 m_list.
9、SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED); 6. 得到 listctrl中所有行的checkbox的状态 m_list.SetExtendedStyle(LVS_EX_CHECKBOXES); CString str; for(int i=0; im_list.GetItemCount(); i+) if( m_list.GetItemState(i, LVIS_SELECTED) = LVIS_SELECTED | m_list.GetCheck(i) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - -
10、- - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 18 页 - - - - - - - - - str.Format(_T(第%d行的 checkbox 为选中状态 ), i); AfxMessageBox(str); 7. 得到 listctrl中所有选中行的序号方法一: CString str; for(int i=0; iGetItemCount(); 12. 删除所有列方法一: while ( m_list.DeleteColumn (0) 因为你删除了第一列后,后面的列会依次向上移动。方法二: int nColumns = 4; for (
11、int i=nColumns-1; i=0; i) m_list.DeleteColumn (i); 13. 得到单击的listctrl的行列号添加 listctrl控件的 NM_CLICK 消息相应函数 void CTest6Dlg:OnClickList1(NMHDR* pNMHDR, LRESULT* pResult) / 方法一: /* DWORD dwPos = GetMessagePos(); CPoint point( LOWORD(dwPos), HIWORD(dwPos) ); m_list.ScreenToClient(&point); LVHITTESTINFO lvin
12、fo; lvinfo.pt = point; lvinfo.flags = LVHT_ABOVE; int nItem = m_list.SubItemHitTest(&lvinfo); if(nItem != -1) CString strtemp; strtemp.Format(单击的是第 %d行第%d列, lvinfo.iItem, 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 18 页 - - - - - - - - - lvinfo.iSubItem); Af
13、xMessageBox(strtemp); */ / 方法二 : /* NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; if(pNMListView-iItem != -1) CString strtemp; strtemp.Format(单击的是第 %d行第%d列, pNMListView-iItem, pNMListView-iSubItem); AfxMessageBox(strtemp); */ *pResult = 0; 14. 判断是否点击在listctrl的 checkbox上添加 listctrl控件的 NM_CLICK 消息相
14、应函数 void CTest6Dlg:OnClickList1(NMHDR* pNMHDR, LRESULT* pResult) DWORD dwPos = GetMessagePos(); CPoint point( LOWORD(dwPos), HIWORD(dwPos) ); m_list.ScreenToClient(&point); LVHITTESTINFO lvinfo; lvinfo.pt = point; lvinfo.flags = LVHT_ABOVE; UINT nFlag; int nItem = m_list.HitTest(point, &nFlag); /判断是
15、否点在 checkbox 上 if(nFlag = LVHT_ONITEMSTATEICON) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 18 页 - - - - - - - - - AfxMessageBox(点在 listctrl的 checkbox 上); *pResult = 0; 15. 右键点击 listctrl的 item 弹出菜单添加 listctrl控件的 NM_RCLICK 消息相应函数 void CTest6Dlg:OnRclickList1(
16、NMHDR* pNMHDR, LRESULT* pResult) NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; if(pNMListView-iItem != -1) DWORD dwPos = GetMessagePos(); CPoint point( LOWORD(dwPos), HIWORD(dwPos) ); CMenu menu; VERIFY( menu.LoadMenu( IDR_MENU1 ) ); CMenu* popup = menu.GetSubMenu(0); ASSERT( popup != NULL ); pop
17、up-TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this ); *pResult = 0; 16. item 切换焦点时 (包括用键盘和鼠标切换 item 时),状态的一些变化顺序添加 listctrl控件的 LVN_ITEMCHANGED消息相应函数 void CTest6Dlg:OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult) NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 名师资料总结 - - -
18、精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 18 页 - - - - - - - - - / TODO: Add your control notification handler code here CString sTemp; if(pNMListView-uOldState & LVIS_FOCUSED) = LVIS_FOCUSED & (pNMListView-uNewState & LVIS_FOCUSED) = 0) sTemp.Format(%d losted focus,p
19、NMListView-iItem); else if(pNMListView-uOldState & LVIS_FOCUSED) = 0 & (pNMListView-uNewState & LVIS_FOCUSED) = LVIS_FOCUSED) sTemp.Format(%d got focus,pNMListView-iItem); if(pNMListView-uOldState & LVIS_SELECTED) = LVIS_SELECTED & (pNMListView-uNewState & LVIS_SELECTED) = 0) sTemp.Format(%d losted
20、selected,pNMListView-iItem); else if(pNMListView-uOldState & LVIS_SELECTED) = 0 & (pNMListView-uNewState & LVIS_SELECTED) = LVIS_SELECTED) sTemp.Format(%d got selected,pNMListView-iItem); *pResult = 0; 17. 得到另一个进程里的listctrl控件的 item内容http:/ - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - -
21、 - - - - - 第 9 页,共 18 页 - - - - - - - - - 18. 选中 listview中的 item Q131284: How To Select a Listview Item Programmatically http:/ 如何在 CListView中使用 CListCtrl 的派生类http:/ listctrl的 subitem添加图标 m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES); m_list.SetItem(.); /具体参数请参考 msdn 21. 在 CListCtrl显示文件,并根据文件类型来显示图标
22、网上找到的代码, share BOOL CTest6Dlg:OnInitDialog() CDialog:OnInitDialog(); HIMAGELIST himlSmall; HIMAGELIST himlLarge; SHFILEINFO sfi; char cSysDirMAX_PATH; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 18 页 - - - - - - - - - CString strBuf; memset(cSysDir, 0, MAX_
23、PATH); GetWindowsDirectory(cSysDir, MAX_PATH); strBuf = cSysDir; sprintf(cSysDir, %s, strBuf.Left(strBuf.Find()+1); himlSmall = (HIMAGELIST)SHGetFileInfo (LPCSTR)cSysDir, 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON ); himlLarge = (HIMAGELIST)SHGetFileInfo(LPCSTR)cSysDir, 0, &sf
24、i, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_LARGEICON); if (himlSmall & himlLarge) :SendMessage(m_list.m_hWnd, LVM_SETIMAGELIST, (WPARAM)LVSIL_SMALL, (LPARAM)himlSmall); :SendMessage(m_list.m_hWnd, LVM_SETIMAGELIST, (WPARAM)LVSIL_NORMAL, (LPARAM)himlLarge); return TRUE; / return TRUE unless yo
25、u set the focus to a control void CTest6Dlg:AddFiles(LPCTSTR lpszFileName, BOOL bAddToDocument) int nIcon = GetIconIndex(lpszFileName, FALSE, FALSE); CString strSize; CFileFind filefind; / get file size if (filefind.FindFile(lpszFileName) filefind.FindNextFile(); strSize.Format(%d, filefind.GetLengt
26、h(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 18 页 - - - - - - - - - else strSize = 0; / split path and filename CString strFileName = lpszFileName; CString strPath; int nPos = strFileName.ReverseFind(); if (nPos != -1) strPath = strFileName.Left(nPos);
27、strFileName = strFileName.Mid(nPos + 1); / insert to list int nItem = m_list.GetItemCount(); m_list.InsertItem(nItem, strFileName, nIcon); m_list.SetItemText(nItem, 1, strSize); m_list.SetItemText(nItem, 2, strFileName.Right(3); m_list.SetItemText(nItem, 3, strPath); int CTest6Dlg:GetIconIndex(LPCTS
28、TR lpszPath, BOOL bIsDir, BOOL bSelected) SHFILEINFO sfi; memset(&sfi, 0, sizeof(sfi); if (bIsDir) SHGetFileInfo(lpszPath, FILE_ATTRIBUTE_DIRECTORY, &sfi, sizeof(sfi), SHGFI_SMALLICON | SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES |(bSelected ? SHGFI_OPENICON : 0); return sfi.iIcon; else SHGetFileIn
29、fo (lpszPath, FILE_ATTRIBUTE_NORMAL, &sfi, 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 18 页 - - - - - - - - - sizeof(sfi), SHGFI_SMALLICON | SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES | (bSelected ? SHGFI_OPENICON : 0); return sfi.iIcon; return -1; 22. li
30、stctrl 内容进行大数据量更新时,避免闪烁 m_list.SetRedraw(FALSE); /更新内容 m_list.SetRedraw(TRUE); m_list.Invalidate(); m_list.UpdateWindow(); 或者参考http:/ listctrl排序Q250614 :How To Sort Items in a CListCtrl in Report View http:/ - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 18 页 - - - -
31、 - - - - - 24. 在 listctrl中选中某个 item 时动态改变其icon或 bitmap Q141834: How to change the icon or the bitmap of a CListCtrlitem in Visual C+ http:/ 在添加 item 后,再 InsertColumn() 后导致整列数据移动的问题Q151897: CListCtrl:InsertColumn() Causes Column Data to Shift http:/ 关于 listctrl第一列始终居左的问题解决办法:把第一列当一个虚列, 从第二列开始插入列及数据,
32、最后删除第一列。具体解释参阅http:/ 锁定 column header的拖动http:/ - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 18 页 - - - - - - - - - 28. 如何隐藏 clistctrl的列把需隐藏的列的宽度设为0, 然后检测当该列为隐藏列时,用上面第 27 点的锁定 column 的拖动来实现29. listctrl进行大数据量操作时, 使用 virtual list http:/ 关于 item 只能显示 259 个字符的问题解决办法:需要在
33、item 上放一个 edit 。31. 响应在 listctrl的 column header 上的鼠标右键单击Q125694: How To Find Out Which Listview Column Was Right-Clicked http:/ - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 18 页 - - - - - - - - - 32. 类似于 windows 资源管理器的listview Q234310: How to implement a ListView c
34、ontrol that is similar to Windows Explorer by using DirLV.exe http:/ 在 ListCtrl中 OnTimer只响应两次的问题Q200054 :PRB: OnTimer() Is Not Called Repeatedly for a List Control http:/ 以下为一些为实现各种自定义功能的listctrl派生类 (1) 拖放http:/ CListCtrl和 CTreeCtrl 间拖放http:/ (2) 多功能 listctrl支持 subitem 可编辑,图标, radiobutton,checkbox,字
35、符串改变颜色的类http:/ subitem 可编辑, subitem 图标,subitem 改变颜色的类http:/ - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 18 页 - - - - - - - - - (3) subitem 中显示超链接http:/ (4) subitem 的 tooltip提示http:/ (5) subitem 中显示进度条http:/ (6) 动态改变 subitem 的颜色和背景色http:/ (7) 类 vb 属性对话框http:/ (8) 选
36、中 subitem( 只高亮选中的 item)http:/ (9) 改变行高http:/ (10) 改变行颜色http:/ (11) 可编辑 subitem 的 listctrlhttp:/ - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 18 页 - - - - - - - - - http:/ (12) subitem 可编辑,插入 combobox ,改变行颜色, subitem 的tooltip提示http:/ (13) header 中允许多行字符串http:/ (14) 插入 comboboxhttp:/ (15) 添加背景图片http:/ (16) 自适应宽度的 listctrlhttp:/ (17) 改变 ListCtrl高亮时的颜色 ( 默认为蓝色 )处理 NM_CUSTOMDRAW http:/ - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 18 页 - - - - - - - - -