




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【转】MFC的CListCtrl的使用与技巧(2011-05-22 16:10:36)转载标签:杂谈列表控件可以看作是功能增强的ListBox,它提供了四种风格,而且可以同时显示一列的多中属性值。MFC中使用CListCtrl类来封装列表控件的各种操作。通过调用 BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );创建一个窗口,dwStyle中可以使用以下一些列表控件的专用风格:LVS_ICON LVS_SMALLICON LVS_LIST LVS_REPORT 这四种风格决定控件的外观,同时只可以选择其中一种,分别对应:大图标显示,小图标显示,列表显示,详细报表显示LVS_EDITLABELS 结点的显示字符可以被编辑,对于报表风格来讲可编辑的只为第一列。LVS_SHOWSELALWAYS 在失去焦点时也显示当前选中的结点LVS_SINGLESEL 同时只能选中列表中一项首先你需要设置列表控件所使用的ImageList,如果你使用大图标显示风格,你就需要以如下形式调用: CImageList* SetImageList( CImageList* pImageList, LVSIL_NORMAL); 如果使用其它三种风格显示而不想显示图标你可以不进行任何设置,否则需要以如下形式调用: CImageList* SetImageList( CImageList* pImageList, LVSIL_SMALL);通过调用int InsertItem( int nItem, LPCTSTR lpszItem );可以在列表控件中nItem指明位置插入一项,lpszItem为显示字符。除LVS_REPORT风格外其他三种风格都只需要直接调用 InsertItem就可以了,但如果使用报表风格就必须先设置列表控件中的列信息。通过调用int InsertColumn( int nCol, LPCTSTR lpszColumnHeading, int nFormat , int nWidth, int nSubItem);可以插入列。iCol为列的位置,从零开始,lpszColumnHeading为显示的列名,nFormat为显示对齐方式, nWidth为显示宽度,nSubItem为分配给该列的列索引。在有多列的列表控件中就需要为每一项指明其在每一列中的显示字符,通过调用 BOOL SetItemText( int nItem, int nSubItem, LPTSTR lpszText );可以设置每列的显示字符。nItem为设置的项的位置,nSubItem为列位置,lpszText为显示字符。下面的代码演示了如何设置多列并插入数据:m_list.SetImageList(&m_listSmall,LVSIL_SMALL);/设置ImageList m_list.InsertColumn(0,Col 1,LVCFMT_LEFT,300,0);/设置列 m_list.InsertColumn(1,Col 2,LVCFMT_LEFT,300,1); m_list.InsertColumn(2,Col 3,LVCFMT_LEFT,300,2); m_list.InsertItem(0,Item 1_1);/插入行 m_list.SetItemText(0,1,Item 1_2);/设置该行的不同列的显示字符 m_list.SetItemText(0,2,Item 1_3); 此外CListCtrl还提供了一些函数用于得到/修改控件的状态。 COLORREF GetTextColor( )/BOOL SetTextColor( COLORREF cr );用于得到/设置显示的字符颜色。 COLORREF GetTextBkColor( )/BOOL SetTextBkColor( COLORREF cr );用于得到/设置显示的背景颜色。 void SetItemCount( int iCount );用于得到添加进列表中项的数量。 BOOL DeleteItem(int nItem);用于删除某一项,BOOL DeleteAllItems( );将删除所有项。 BOOL SetBkImage(HBITMAP hbm, BOOL fTile , int xOffsetPercent, int yOffsetPercent);用于设置背景位图。 CString GetItemText( int nItem, int nSubItem );用于得到某项的显示字符。列表控件的消息映射同样使用ON_NOTIFY宏,形式如同:ON_NOTIFY( wNotifyCode, id, memberFxn ),wNotifyCode为通知代码,id为产生该消息的窗口ID,memberFxn为处理函数,函数的原型如同void OnXXXList(NMHDR* pNMHDR, LRESULT* pResult),其中pNMHDR为一数据结构,在具体使用时需要转换成其他类型的结构。对于列表控件可能取值和对应的数据结构为:LVN_BEGINLABELEDIT 在开始某项编辑字符时发送,所用结构:NMLVDISPINFOLVN_ENDLABELEDIT 在结束某项编辑字符时发送,所用结构:NMLVDISPINFOLVN_GETDISPINFO 在需要得到某项信息时发送,(如得到某项的显示字符)所用结构:NMLVDISPINFO关于ON_NOTIFY有很多内容,将在以后的内容中进行详细讲解。关于动态提供结点所显示的字符:首先你在项时需要指明lpszItem参数为: LPSTR_TEXTCALLBACK。在控件显示该结点时会通过发送TVN_GETDISPINFO来取得所需要的字符,在处理该消息时先将参数 pNMHDR转换为LPNMLVDISPINFO,然后填充其中item.pszText。通过item中的iItem,iSubItem可以知道当前显示的为那一项。下面的代码演示了这种方法:char szOut83=No.1,No.2,No.3; /添加结点 m_list.InsertItem(LPSTR_TEXTCALLBACK,.) m_list.InsertItem(LPSTR_TEXTCALLBACK,.) /处理消息 关于编辑某项的显示字符:(在报表风格中只对第一列有效)首先需要设置列表控件的 LVS_EDITLABELS风格,在开始编辑时该控件将会发送LVN_BEGINLABELEDIT,你可以通过在处理函数中返回TRUE来取消接下来的编辑,在编辑完成后会发送LVN_ENDLABELEDIT,在处理该消息时需要将参数pNMHDR转换为LPNMLVDISPINFO,然后通过其中的item.pszText得到编辑后的字符,并重置显示字符。如果编辑在中途中取消该变量为NULL。下面的代码说明如何处理这些消息:/处理消息 LVN_BEGINLABELEDIT void CParentWnd:OnBeginEditList(NMHDR* pNMHDR, LRESULT* pResult) LV_DISPINFO* pLVDI = (LV_DISPINFO*)pNMHDR; if(pLVDI-item.iItem=0);/判断是否取消该操作 *pResult = 1; else *pResult = 0; /处理消息 LVN_BEGINLABELEDIT void CParentWnd:OnBeginEditList(NMHDR* pNMHDR, LRESULT* pResult) LV_DISPINFO* pLVDI = (LV_DISPINFO*)pNMHDR; if(pLVDI-item.pszText=NULL);/判断是否已经取消取消编辑 m_list.SetItemText(pLVDI-item.iItem,0,pLVDI-pszText);/重置显示字符 *pResult = 0; 上面讲述的方法所进行的消息映射必须在父窗口中进行(同样WM_NOTIFY的所有消息都需要在父窗口中处理)。如何得到当前选中项位置:在列表控件中没有一个类似于ListBox中GetCurSel()的函数,但是可以通过调用GetNextItem( -1, LVNI_ALL | LVNI_SELECTED);得到选中项位置。下面是一些例子作者:lixiaosan 时间:04/06/2006以下未经说明,listctrl默认view 风格为report相关类及处理函数MFC:CListCtrl类SDK:以 “ListView_”开头的一些宏。如 ListView_InsertColumn1. 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); /设置扩展风格 注:listview的style请查阅msdn /library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrflistviewstyles.asp 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; 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); 7. 得到listctrl中所有选中行的序号 方法一: CString str; for(int i=0; iGetItemCount(); 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) / 方法一: / 方法二: *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; 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.asp18. 选中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; CString 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.MFC的CListCtrl的排序功能 / 排序用的比较函数staticintCALLBACKMyCompareProc(LPARAMlParam1, LPARAMlParam2, LPARAMlParamSort) CString &lp1 = *(CString *)lParam1); CString &lp2 = *(CString *)lParam2); int &sort = *(int *)lParamSort; if (sort = 0) returnlp1.CompareNoCase(lp2); else returnlp2.CompareNoCase(lp1); /要处理的事件ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST1, &CDlg:OnLvnColumnclickList1)/处理代码voidCDlg:OnLvnColumnclickList1(NMHDR *pNMHDR, LRESULT *pResult) LPNMLISTVIEWpNMLV = reinterpret_cast(pNMHDR); intLength = m_ListCtrl.GetItemCount(); CArray ItemData; ItemData.SetSize(Length); for (inti = 0; i iSubItem); m_ListCtrl.SetItemData(i,(DWORD_PTR)&ItemDatai);/设置排序关键字 staticintsort = 0; staticintSubItem = 0; if (SubItem != pNMLV-iSubItem) sort = 0; SubItem = pNMLV-iSubItem; else if (sort = 0) sort = 1; else sort = 0; m_ListCtrl.SortItems(MyCompareProc,(DWORD_PTR)&sort);/排序 *pResult = 0;23.CListCtrl显示样式的改变m_pCtrl = &this-GetListCtrl(); /获得指针/CListCtrl样式改变LONG lStyle;lStyle = GetWindowLong(m_pCtrl-m_hWnd, GWL_STYLE); /获取当前窗口stylelStyle &= LVS_TYPEMASK; /清除显示方式lStyle |= LVS_REPORT; /设置style为Report显示SetWindowLong(m_pCtrl-m_hWnd, GWL_STYLE, lStyle); /CListCtrl扩展样式改变DWORD dwStyle;dwStyle = m_pCtrl-GetStyle(); /取得样式dwStyle |= LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT ; /添加样式m_pCtrl-SetExtendedStyle(dwStyle); /重新设置需要的样式(根据自己的需要的样式选择) LVS_ICON: 为每个item显示大图标 LVS_SMALLICON: 为每个item显示小图标 LVS_LIST: 显示一列带有小图标的item LVS_REPORT: 显示item详细资料 LVS_EX_FULLROWSELECT: 表示选中某行使整行高亮(只适用与report风格的CListCtrl) LVS_EX_GRIDLINES: 表示显示网格线(只适用与report风格的CListCtrl) 24.添加CListCtrl的记录/插入列m_pCtrl-InsertColumn(1,第一列,LVCFMT_CENTER,47); /序号,标题,标题显示位置,列宽度m_pCtrl-InsertColumn(2,第二列,LVCFMT_CENTER,100);/写入数据int nRow = m_list.InsertItem(0, “无用字符串”); /插入行m_list.SetItemText(nRow, 1, “1111”); /设置数据m_list.SetItemText(nRow, 2, “2222”); /设置数据25.判断CListCtrl的哪行记录被选中了int n = -1;POSITION pos = m_pCtrl-GetFirstSelectedItemPosition(); /返回第一个选中的行位置if (po
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 基层拆除施工方案(3篇)
- 福田深水井施工方案(3篇)
- 咸宁庭院假山施工方案(3篇)
- 施工方案优化钢筋(3篇)
- 二装施工方案(3篇)
- 北京市昌平区2024-2025学年八年级下学期第二次月考历史题目及答案
- 新春趣味猜谜题目及答案
- 写意头像测试题目及答案
- 小羊和狼数学题目及答案
- 蓝色画风初中新生入学指南
- FZ/T 07014-2021绿色设计产品评价技术规范聚酯涤纶
- 新型敷料的特性及选择
- 膝关节体格检查专家讲座
- 江苏城市规划收费标准
- 花生膜下滴灌技术
- 第4章 动车组车体检修动车组维护与检修
- 某某公司省长市长质量奖申报自述材料
- 2022年名师工作室工作计划
- 电影预算表格(双语)
- 人教版高一物理必修一全套课件
- 物业证明格式范本
评论
0/150
提交评论