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