CListCtrl_使用技巧.doc_第1页
CListCtrl_使用技巧.doc_第2页
CListCtrl_使用技巧.doc_第3页
CListCtrl_使用技巧.doc_第4页
CListCtrl_使用技巧.doc_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

可以创建一个EditBox,平时隐藏,当双击(或者其他事件)发生在某一单元格时,将它显示出来- 取原有单元格内容显示- 修改- (回车转移焦点等事件发生后)更新原有单元格内容- 隐藏.当你双击的时候,在选中的item的区域动态创建一个EDIT,在失去焦点时destroy这个edit就可以了。以下未经说明,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.asp3. 插入数据 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_SHOWSELALWAYS5. 选中和取消选中一行 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) / 方法一: /* 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; 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中的item Q131284: How To Select a Listview Item Programmatically/kb/131284/en-us19. 如何在CListView中使用CListCtrl的派生类/cpp/controls/listview/introduction/article.php/c919/20. listctrl的subitem添加图标 m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES); m_list.SetItem(.); /具体参数请参考msdn21. 在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. 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.asp23. listctrl排序 Q250614:How To Sort Items in a CListCtrl in Report View/kb/250614/en-us24. 在listctrl中选中某个item时动态改变其icon或bitmapQ141834: How to change the icon or the bitmap of a CListCtrl item in Visual C+/kb/141834/en-usWhen you initialize the CListCtrl by calling CListCtrl:InsertItem(), you can pass in a value of I_IMAGECALLBACK for the index of the image. This means that the system expects you to fill in the image index when you get an LVN_GETDISPINFO notification. Inside of the handler for LVN_GETDISPINFO, you can check if the item is selected and set the appropriate image index. Sample Code:BEGIN_MESSAGE_MAP(CTestView, CView) /AFX_MSG_MAP(CTestView) ON_WM_CREATE() /AFX_MSG_MAP ON_NOTIFY (LVN_GETDISPINFO, IDI_LIST, OnGetDispInfo) END_MESSAGE_MAP() int CTestView:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CView:OnCreate(lpCreateStruct) = -1) return -1; / m_pImage is a CTestViews member variable of type CImageList* / create the CImageList with 16x15 images m_pImage = new CImageList(); VERIFY (m_pImage-Create (16, 15, TRUE, 0, 1); CBitmap bm; / IDR_MAINFRAME is the toolbar bitmap in a default AppWizard / project. bm.LoadBitmap (IDR_MAINFRAME); / This will automatically parse the bitmap into nine images. m_pImage-Add (&bm, RGB (192, 192, 192); / m_pList is CTestViews member variable of type CListCtrl* / create the CListCtrl. m_pList = new CListCtrl(); VERIFY (m_pList-Create (WS_VISIBLE | WS_CHILD | LVS_REPORT | LVS_EDITLABELS, CRect (0, 0, 400, 400), this, IDI_LIST); / Create column. m_pList-InsertColumn (0, Button Number, LVCFMT_LEFT, 100); / Associate CImageList with CListCtrl. m_pList-SetImageList (m_pImage, LVSIL_SMALL); char szTemp10; for (int iCntr = 0; iCntr InsertItem (LVIF_IMAGE | LVIF_TEXT, iCntr, szTemp, 0, 0, I_IMAGECALLBACK, 0L); return 0; void CTestView:OnGetDispInfo (NMHDR* pnmhdr, LRESULT* pResult) LV_DISPINFO* pdi = (LV_DISPINFO *) pnmhdr; / Fill in the LV_ITEM structure with the image info. / When an item is selected, the image is set to the first / image (the new bitmap on the toolbar). / When it is not selected, the image index is equal to the / item number (that is, 0=new, 1=open, 2=save, and so on.) if (LVIS_SELECTED = m_pList-GetItemState (pdi-item.iItem, LVIS_SELECTED) pdi-item.iImage = 0; else pdi-item.iImage = pdi-item.iItem; CTestView:CTestView() / Clean up. delete m_pImage; delete m_pList; 25. 在添加item后,再InsertColumn()后导致整列数据移动的问题Q151897: CListCtrl:InsertColumn() Causes Column Data to Shift /kb/151897/en-us26. 关于listctrl第一列始终居左的问题解决办法:把第一列当一个虚列,从第二列开始插入列及数据,最后删除第一列。 具体解释参阅 /library/default.asp?url=/library/en-us/shellcc/platform/commctls/listview/structures/lvcolumn.asp27. 锁定column header的拖动/msdnmag/issues/03/06/CQA/28. 如何隐藏clistctrl的列 把需隐藏的列的宽度设为0,然后检测当该列为隐藏列时,用上面第27点的锁定column 的拖动来实现29. listctrl进行大数据量操作时,使用virtual list /msj/archive/S2061.aspx/cpp/controls/listview/advanced/article.php/c4151//listctrl/virtuallist.asp30. 关于item只能显示259个字符的问题解决办法:需要在item上放一个edit。31. 响应在listctrl的column header上的鼠标右键单击Q125694: How To Find Out Which Listview Column Was Right-Clicked/kb/125694/en-us32. 类似于windows资源管理器的listviewQ234310: How to implement a ListView control that is similar to Windows Explorer by using DirLV.exe/kb/234310/en-us33. 在ListCtrl中OnTimer只响应两次的问题Q200054:PRB: OnTimer() Is Not Called Repeatedly for a List Control/kb/200054/en-us34. 以下为一些为实现各种自定义功能的listctrl派生类 (1) 拖放 /listctrl/dragtest.asp 在CListCtrl和CTreeCtrl间拖放 /kb/148738/en-us (2) 多功能listctrl 支持subitem可编辑,图标,radiobutton,checkbox,字符串改变颜色的类 /listctrl/quicklist.asp 支持排序,subitem可编辑,subitem图标,subitem改变颜色的类 /listctrl/ReportControl.asp (3) subitem中显示超链接 /listctrl/CListCtrlLink.asp (4) subitem的tooltip提示 /listctrl/ctooltiplistctrl.asp (5) subitem中显示进度条 /listctrl/ProgressListControl.asp /listctrl/napster.asp /Cpp/controls/listview/article.php/c4187/ (6) 动态改变subitem的颜色和背景色 /listctrl/highlightlistctrl.asp /Cpp/controls/listbox/colorlistboxes/article.php/c4757/ (7) 类vb属性对话框 /listctrl/propertylistctrl.asp /Cpp/controls/listview/propertylists/article.php/c995/ /Cpp/controls/listview/propertylists/article.php/c1041/ (8) 选中subitem(只高亮选中的item) /listctrl/SubItemSel.asp /listctrl/ListSubItSel.asp (9) 改变行高 http

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论