1、ListCtrl控件的风格设置1. ListCtrl 风格 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; /清除显示
2、方式位 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前生成checkb
3、ox控件 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_S
4、HOWSELALWAYS-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; iC
5、ursorLocation = adUseClient;m_pRs-Open(LPCTSTR)strIns, vDispatch, adOpenKeyset,adLockOptimistic, adCmdUnknown);-7. 得到listctrl中所有选中行的序号 方法一: CString str; for(int i=0; iGetItemCount();-12. 删除所有列 方法一: while ( m_list.DeleteColumn (0) 因为你删除了第一列后,后面的列会依次向上移动。 方法二: int nColumns = 4; for (int i=nColumns-1;
6、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 = poi
7、nt; 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;
8、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(d
9、wPos) ); 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弹出菜单 添加listctr
10、l控件的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 =
11、 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* pNM
12、ListView = (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)
13、 = 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 & LVI
14、S_SELECTED) = 0 & (pNMListView-uNewState & LVIS_SELECTED) = LVIS_SELECTED) sTemp.Format(%d got selected,pNMListView-iItem); *pResult = 0; -17. listctrl的 subitem 添加图标 注意: 首先要用 InsertItem() 插入一行的第一列, 然后才能用 SetItem 设置其他项 m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES); m_userlist.SetItem(.);-18. 在CListCt
15、rl显示文件,并根据文件类型来显示图标 网上找到的代码,自己试用并改正过, share 步骤1: 设置 list 的图像列表为 系统图像列表 BOOL SetSystemImageList( CListCtrl & list ) HIMAGELIST himlSmall; HIMAGELIST himlLarge; SHFILEINFO sfi; char cSysDirMAX_PATH; CString strBuf; memset(cSysDir, 0, MAX_PATH); GetWindowsDirectory(cSysDir, MAX_PATH); strBuf = cSysDir
16、; / SHGetFileInfo: / If uFlags contains SHGFI_SYSICONINDEX, the return value is a handle to / an image list that contains the large icon images. / If SHGFI_SMALLICON is included with SHGFI_SYSICONINDEX, the return value / is the handle to an image list that contains the small icon images. / himlSmal
17、l = (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(list.m_hWnd, LVM_SET
18、IMAGELIST, (WPARAM)LVSIL_SMALL, (LPARAM)himlSmall); :SendMessage(list.m_hWnd, LVM_SETIMAGELIST, (WPARAM)LVSIL_NORMAL, (LPARAM)himlLarge); return TRUE;步骤2: 给列表添加指定的文件, 同时获得该文件的的图标索引, 给 list 添加图标int GetIconIndex(LPCTSTR lpszPath, BOOL bIsDir, BOOL bSelected) ; / 向前声明void AddFiles(CListCtrl & list, LPC
19、TSTR lpszFileName, BOOL bAddToDocument) int nIcon = GetIconIndex(lpszFileName, FALSE, TRUE); 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
20、 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 = list.GetItemCount();/list.InsertItem(nItem, strFileName, nIcon); /list.SetItemText(nItem, 1, strSi
21、ze); / / 此处可以根据实际需要修改代码 / -19. listctrl内容进行大数据量更新时,避免闪烁 m_list.SetRedraw(FALSE); /更新内容 m_list.SetRedraw(TRUE); m_list.Invalidate(); m_list.UpdateWindow();20. 清除 ListCtrl 以重新初始化: / 删除所有行 m_ctrllist.DeleteAllItems() ; / 删除所有列 int iColCount = m_ctrllist.GetHeaderCtrl()-GetItemCount() ; / 方法 1 / 原理: 删除第一列后, 其他列向前移动 while( m_ctrllist.DeleteColumn(0) ) ; / 方法 2 for (int i=0; i iColCount ; i ) m_ctrllist.DeleteColumn(0);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1