




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MFC如何使用 List Control以下未经说明,listctrl默认view 风格为report相关类及处理函数MFC:CListCtrl类SDK:以 “ListView_”开头的一些宏。如 ListView_InsertColumn-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_TYPEMASK; /清除显示方式位 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_CHECKBOXES;/item前生成checkbox控件 m_list.SetExtendedStyle(dwStyle); /设置扩展风格-3. 插入数据 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点中设置LVS_SHOWSELALWAYS-5. 选中和取消选中一行 int nIndex = 0; /选中 m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED); /取消选中 m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);-6. 得到listctrl中所有行的checkbox的状态 m_list.SetExtendedStyle(LVS_EX_CHECKBOXES); CString str; for(int i=0; i if( m_list.GetItemState(i, LVIS_SELECTED) = LVIS_SELECTED | m_list.GetCheck(i) str.Format(_T(第%d行的checkbox为选中状态), i); AfxMessageBox(str); -7. 得到listctrl中所有选中行的序号 方法一: CString str; for(int i=0; i if( m_list.GetItemState(i, LVIS_SELECTED) = LVIS_SELECTED ) str.Format(_T(选中了第%d行), i); nbsp; AfxMessageBox(str); 方法二: POSITION pos = m_list.GetFirstSelectedItemPosition(); if (pos = NULL) TRACE0(No items were selected!n); else while (pos) int nItem = m_list.GetNextSelectedItem(pos); TRACE1(Item %d was selected!n, nItem); / you could do your own processing on nItem here -8. 得到item的信息 TCHAR szBuf1024; LVITEM lvi; lvi.iItem = nItemIndex; lvi.iSubItem = 0; lvi.mask = LVIF_TEXT; lvi.pszText = szBuf; lvi.cchTextMax = 1024; m_list.GetItem(&lvi); 关于得到设置item的状态,还可以参考msdn文章 Q173242: Use Masks to Set/Get Item States in CListCtrl /kb/173242/en-us-9. 得到listctrl的所有列的header字符串内容 LVCOLUMN lvcol; char str256; int nColNum; CString strColumnName4;/假如有4列 nColNum = 0; lvcol.mask = LVCF_TEXT; lvcol.pszText = str; lvcol.cchTextMax = 256; while(m_list.GetColumn(nColNum, &lvcol) strColumnNamenColNum = lvcol.pszText; nColNum+; -10. 使listctrl中一项可见,即滚动滚动条 m_list.EnsureVisible(i, FALSE);-11. 得到listctrl列数 int nHeadNum = m_list.GetHeaderCtrl()-GetItemCount();-12. 删除所有列 方法一: while ( m_list.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(dwPos), HIWORD(dwPos) ); m_list.ScreenToClient(&point); LVHITTESTINFO lvinfo; lvinfo.pt = point; lvinfo.flags = LVHT_ABOVE; int nItem = m_list.SubItemHitTest(&lvinfo); if(nItem != -1) CString 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); */ *pResult = 0; -14. 判断是否点击在listctrl的checkbox上 添加listctrl控件的NM_CLICK消息相应函数 void CTest6Dlg:OnClickList1(NMHDR* pNMHDR, LRESULT* pResult) DWORD dwPos = GetMessagePos(); CPoint point( LOWORD(dwPos), HIWORD(dwPos) ); m_list.ScreenToClient(&point); LVHITTESTINFO lvinfo; nbsp; lvinfo.pt = point; lvinfo.flags = LVHT_ABOVE; UINT nFlag; int nItem = m_list.HitTest(point, &nFlag); /判断是否点在checkbox上 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) DWORD dwPos = GetMessagePos(); CPoint point( LOWORD(dwPos), HIWORD(dwPos) ); CMenu menu; VERIFY( menu.LoadMenu( IDR_MENU1 ) ); CMenu* popup = menu.GetSubMenu(0); ASSERT( popup != NULL ); popup-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 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); 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 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内容/threads/int64_memsteal.asp-18. 选中listview中的itemQ131284: How To Select a Listview Item Programmatically/kb/131284/en-us-19. 如何在CListView中使用CListCtrl的派生类/cpp/controls/listview/introduction/article.php/c919/-20. listctrl的subitem添加图标 m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES); m_list.SetItem(.); /具体参数请参考msdn-21. 在CListCtrl显示文件,并根据文件类型来显示图标 网上找到的代码,share BOOL CTest6Dlg:OnInitDialog() CDialog:OnInitDialog(); HIMAGELIST himlSmall; HIMAGELIST himlLarge; SHFILEINFO sfi; char cSysDirMAX_PATH; String strBuf; memset(cSysDir, 0, MAX_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, &sfi, 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 you 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.GetLength(); else strSize = 0; / split path and filename CString strFileName = lpszFileName; CString strPath; int nPos = strFileName.ReverseFind(); if (nPos != -1) strPath = strFileName.Left(nPos); 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(LPCTSTR 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 SHGetFileInfo (lpszPath, FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi), SHGFI_SMALLICON | SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES | (bSelected ? SHGFI_OPENICON : 0); return sfi.iIcon; return -1; -22. listctrl内容进行大数据量更新时,避免闪烁 m_list.SetRedraw(FALSE); /更新内容 m_list.SetRedraw(TRUE); m_list.Invalidate(); m_list.UpdateWindow();或者参考/library/default.asp?url=/library/en-us/vclib/html/_mfc_cwnd.3a3a.setredraw.asp-23. listctrl排序 Q250614:How To Sort Items in a CListCtrl in Report View/kb/250614/en-us-24. 在listctrl中选中某个item时动态改变其icon或bitmapQ141834: How to change the icon or the bitmap of a CListCtrl item in Visual C+/kb/141834/en-us-25. 在添加item后,再InsertColumn()后导致整列数据移动的问题Q151897: CListCtrl:InsertColumn() Causes Column Data to Shift /kb/151897/en-us-26. 关于listctrl第一列始终居左的问题解决办法:把第一列当一个虚列,从第二列开始插入列及数据,最后删除第一列。 具体解释参阅 /lib
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 变电站建设工程节能评估报告
- 广东省东莞市东莞港2024-2025学年高二上学期第二次月考语文考题及答案
- 轻型钢结构构件制造与运输方案
- 安装过程中施工方案与工艺优化
- 停薪留职期间员工薪酬及福利调整及权益保障协议
- 智能能源科技公司股份交易与能源互联网建设合同
- 智能化数据中心机房建设与智能调度服务合同
- 离婚分居子女抚养及财产分割协议范本
- 碳捕集利用系统设计与优化方案
- 离婚协议公证及财产分割、子女抚养及监护权确认协议
- 制药企业GMP生产质量管理培训资料
- 4.1.2+无理数指数幂及其运算性质课件-2025-2026学年高一上学期数学人教A版必修第一册
- 工程用工实名管理方案(3篇)
- 2025兴业银行福建总行国际业务部交易银行部招聘若干人备考考试题库附答案解析
- 1.3 几和第几(课件)数学苏教版一年级上册(新教材)
- 食品卫生消防安全应急预案
- 1.3加与减①(课件)数学沪教版二年级上册(新教材)
- 2025至2030中国HPV相关疾病行业项目调研及市场前景预测评估报告
- 无领导小组讨论的经典面试题目及答案解析
- 许昌襄城县特招医学院校毕业生招聘笔试真题2024
- 永辉超市快消培训
评论
0/150
提交评论