MFC CListCtrl控件的基本使用
来源:互联网 发布:零基础云计算视频教程 编辑:程序博客网 时间:2024/06/04 18:05
一:加载图标
前三种ICON,small icon,list都是已图标形式存在,那么他的重点也就是怎么加载图标
首先创建CImageList的对象m_ImageList1
//创建大图标,Craete创建一个图标列表,当然大小可以随意设置,这里采用的是加载ICON
if ( m_ImageList1.GetSafeHandle() == NULL ){ m_ImageList1.Create(80,80,ILC_MASK|ILC_COLOR32, 0, 0); m_ImageList1.Add(AfxGetApp()->LoadIcon(IDR_MAINFRAME)); m_ListCtrl1.SetImageList(&m_ImageList1, LVSIL_NORMAL);}//加载BMP图片if (m_StatusImage.GetSafeHandle()==NULL){ CBitmap Image; BITMAP ImageInfo; Image.LoadBitmap(IDB_SERVER_LIST_IMAGE); Image.GetBitmap(&ImageInfo); m_StatusImage.Create(18,ImageInfo.bmHeight,ILC_COLOR16|ILC_MASK,0,0); m_StatusImage.Add(&Image,RGB(255,0,255));}m_ListCtrl2.SetImageList(&m_StatusImage,LVSIL_SMALL);m_ListCtrl3.SetImageList(&m_StatusImage,LVSIL_SMALL);//插入节点for (int i=0;i<40;i++){ m_ListCtrl1.InsertItem(i, TEXT("Item")); m_ListCtrl2.InsertItem(i, TEXT("Item")); m_ListCtrl3.InsertItem(i, TEXT("Item"));}
到这里,我们就添加了图标形式的节点,现在在说一下Report的操作方法,当然下面的操作也适用于图标样式,关于ClistCtrl的成员函数讲解,参照MSDN,这里只说明使用方法
二:Report风格的CListCtrl的使用
创建列,也就是为标头控件添加节点
m_ListCtrl4.InsertColumn( 0, TEXT("Main_1"), LVCFMT_LEFT, 70 );m_ListCtrl4.InsertColumn( 1, TEXT("Main_2"), LVCFMT_LEFT, 70 );m_ListCtrl4.InsertColumn( 2, TEXT("Main_3"), LVCFMT_LEFT, 70 );
设置风格
之前我们修改窗口属性的时候都是使用的SetWindowLong函数或者ModifyStyle,这次CListCtrl为我们提供一个新函数,SetExtendedStyle,当然通过它只能修改扩展属性
支持的扩展属性很多,但是常用的就几个而已,其他的可以参照msdn,这里讲解两个常用的样式
LVS_EX_CHECKBOXES:将CListCtrl添加check控件LVS_EX_FULLROWSELECT:未添加该样式,选择一个节点,只能选中节点的第一个元素,而这个属性则可以让选择节点的时候选中整行
当然这些属性可以多个同时存在
m_ListCtrl4.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT );
添加图标,图标的添加方式和ICON样式的添加方式是一样的,这里我们添加bmp图片,在了解另一种添加方式
//加载BMP图标if (m_StatusImage.GetSafeHandle()==NULL){ CBitmap Image; BITMAP ImageInfo; Image.LoadBitmap(IDB_SERVER_LIST_IMAGE); Image.GetBitmap(&ImageInfo); m_StatusImage.Create(18,ImageInfo.bmHeight,ILC_COLOR16|ILC_MASK,0,0); m_StatusImage.Add(&Image,RGB(255,0,255));}m_ListCtrl4.SetImageList(&m_StatusImage,LVSIL_SMALL);
插入节点并设置节点的文本内容
void CListCtrlDlg::OnBnClickInsert(){ int nCount = m_ListCtrl4.GetItemCount(); int nRow = m_ListCtrl4.InsertItem(LVIF_IMAGE|LVIF_TEXT|LVIF_PARAM,0,TEXT("Item_1"),0,0,2,0); m_ListCtrl4.SetItemText(nRow, 1, TEXT("Item_2")); m_ListCtrl4.SetItemText(nRow, 2, TEXT("Item_3"));}
判断节点是否被Check选中,GetCheck
void CListCtrlDlg::OnBnClickCheckState(){ CString str,str1=TEXT("被Check的行数分别为:"); for(int i=0; i<m_ListCtrl4.GetItemCount(); i++) { if( m_ListCtrl4.GetCheck(i)) { str.Format(TEXT("[%d]"),i); str1+=str; } } AfxMessageBox(str1);}
获取选中行的索引,默认情况下,CListCtrl是支持多选的,支持Ctrl和Shift操作,如果需要单选,可以将控件的Single Selection设为true或者添加LVS_SINGLESEL属性,这里介绍两种方法:
方法1:我们通过遍历所有行,然后挨行判断当前的状态即可
CString str,str1=TEXT("选中的行数分别为:");for(int i=0; i<m_ListCtrl4.GetItemCount(); i++){ if( m_ListCtrl4.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED ) { str.Format(TEXT("[%d]"),i); str1+=str; }}AfxMessageBox(str1);m_ListCtrl4.SetFocus();
方法2:通过迭代的方式进行遍历
POSITION pos = m_ListCtrl4.GetFirstSelectedItemPosition();if (pos == NULL){ str1 = TEXT("没有选中任何节点");}else{ while (pos) { int nItem = m_ListCtrl4.GetNextSelectedItem(pos); str.Format(TEXT("[%d]"),nItem); str1+=str; }}AfxMessageBox(str1);m_ListCtrl4.SetFocus();
获取列数,这里我们就使用了CHeaderCtrl控件
int nColumnCount = m_ListCtrl4.GetHeaderCtrl()->GetItemCount();
获取节点的信息GetItem,这里我们获取最后一行的信息
void CListCtrlDlg::OnBnClickInfo(){ TCHAR szBuffer[MAX_PATH]=TEXT(""); CString str=TEXT("节点信息分别为:"); //获取列数 int nColumnCount = m_ListCtrl4.GetHeaderCtrl()->GetItemCount(); LVITEM lvi; lvi.iItem = m_ListCtrl4.GetItemCount()-1; lvi.mask = LVIF_TEXT; lvi.cchTextMax = CountArray(szBuffer); for (int i=0;i<nColumnCount; i++) { lvi.iSubItem = i; lvi.pszText = szBuffer; m_ListCtrl4.GetItem(&lvi); str+=TEXT("["); str+=szBuffer; str+=TEXT("] "); } AfxMessageBox(str);}
滚动到要显示的行上,很多时候,我们的数据比较大,而我们通过查找获取获取到了行数后,我们想快速定位的该行,这里我们就可以用EnsureVisible,这里举例定位到最后一行,并且选中该行
void CListCtrlDlg::OnBnClickVis(){ int nItem = m_ListCtrl4.GetItemCount()-1; m_ListCtrl4.EnsureVisible(nItem, FALSE); m_ListCtrl4.SetItemState(nItem, LVIS_FOCUSED | LVIS_SELECTED,LVIS_FOCUSED | LVIS_SELECTED); m_ListCtrl4.SetSelectionMark(nItem); m_ListCtrl4.SetFocus();}
选中行,注意:这句代码只是让指定行高亮显示,如果使用后再用GetSelectionMark函数来得到选中行,结果往往是错误的。比如,先用鼠标点击选中第5行,调用GetSelectionMark函数得到的是4(第5行),再调用SetItemState函数选中第2行,然后调用GetSelectionMark函数得到的还是4(第5行),所以,需要在设置选中行高亮显示时,一般与SetSelectionMark函数连用
m_ListCtrl4.SetItemState(nItem, LVIS_FOCUSED | LVIS_SELECTED,LVIS_FOCUSED | LVIS_SELECTED);m_ListCtrl4.SetSelectionMark(nItem);m_ListCtrl4.SetFocus();
取消选中
void CListCtrlDlg::OnBnClickUnSel(){ for(int i=0; i<m_ListCtrl4.GetItemCount(); i++) { if( m_ListCtrl4.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED ) { m_ListCtrl4.SetItemState(i,0,LVIS_SELECTED); } } m_ListCtrl4.SetSelectionMark(-1); m_ListCtrl4.SetFocus();}
获取标头控件的节点文本
void CListCtrlDlg::OnBnClickHead(){ LVCOLUMN lvcol; TCHAR szBuffer[MAX_PATH]=TEXT(""); int nColumnIndex;; CString str=TEXT("标题头文本分别为:"); nColumnIndex = 0; lvcol.mask = LVCF_TEXT; lvcol.pszText = szBuffer; lvcol.cchTextMax = CountArray(szBuffer); while(m_ListCtrl4.GetColumn(nColumnIndex, &lvcol)) { str+=TEXT("["); str+= lvcol.pszText; str+=TEXT("]"); nColumnIndex++; } AfxMessageBox(str);}
删除所有行
m_ListCtrl4.DeleteAllItems();
删除指定行,举例删除最后一行
m_ListCtrl4.DeleteItem(m_ListCtrl4.GetItemCount()-1);
删除所有,包括标头控件,这里还是用两种方法去做
方法1:当删除了节点0之后,下面的节点都会往上移动,重新排列,所以我们只要依次把所有的第一个节点都删除即可
while( m_ListCtrl4.DeleteColumn(0) );
方法2:这里和第一种方法原理类似,这次是从后往前删除
int nColumnCount = m_ListCtrl4.GetHeaderCtrl()->GetItemCount();for (int i=nColumnCount-1; i>=0; i--) m_ListCtrl4.DeleteColumn (i);
左键消息,添加ON_NOTIFY的NM_CLICK消息,这里我们举例单击事件的区域位置,即鼠标在哪行哪列点击了,仍然举两种方法
方法1:
void CListCtrlDlg::OnLclickList4(NMHDR *pNMHDR, LRESULT *pResult){ LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); //方法一: DWORD dwPos = GetMessagePos(); CPoint point( LOWORD(dwPos), HIWORD(dwPos) ); m_ListCtrl4.ScreenToClient(&point); LVHITTESTINFO lvinfo; lvinfo.pt = point; lvinfo.flags = LVHT_ABOVE; int nItem = m_ListCtrl4.SubItemHitTest(&lvinfo); if(nItem != -1) { CString str; str.Format(TEXT("单击的是第%d行第%d列"), lvinfo.iItem, lvinfo.iSubItem); AfxMessageBox(str); } *pResult = 0;}
//方法2:void CListCtrlDlg::OnLclickList4(NMHDR *pNMHDR, LRESULT *pResult){ LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); // 方法二: NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; if(pNMListView->iItem != -1) { CString str; str.Format(TEXT("单击的是第%d行第%d列"),pNMListView->iItem, pNMListView->iSubItem); AfxMessageBox(str); } *pResult = 0;}
右键消息:添加ON_NOTIFY的NM_RCLICK消息,这里举例是右键菜单
void CListCtrlDlg::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; if (menu.CreatePopupMenu()==FALSE) return; menu.AppendMenu(0,2000,TEXT("菜单节点")); menu.AppendMenu(0,2001,TEXT("菜单节点")); menu.AppendMenu(0,2002,TEXT("菜单节点")); menu.TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON,point.x,point.y,this); } *pResult = 0;}
转载自:https://jingyan.baidu.com/article/1709ad80a079f94634c4f0a2.html
- MFC CListCtrl控件的基本使用
- MFC CListCtrl 的使用
- MFC中控件之CListCtrl的使用总结
- CListCtrl的基本使用
- CListCtrl控件的使用
- CListCtrl控件的基本使用方法
- CListCtrl控件控件的使用
- MFC控件使用总结——CListCtrl
- MFC控件使用总结——CListCtrl
- MFC 常用控件使用 —— CListCtrl
- MFC控件使用总结——CListCtrl
- MFC中CListCtrl的使用
- VC/MFC中 CListCtrl控件的使用方法
- MFC中CListCtrl控件的用法
- MFC CLIstCtrl控件的高度设置
- 自定义MFC ClistCtrl控件的示例代码
- MFC里的CTreeCtrl控件和CListCtrl控件的结合使用之一
- MFC 基本控件使用
- 内网和外网的区别 连接不同设备上网
- 让人相见恨晚的vim插件:模糊查找神器LeaderF
- java本地文件与文件夹
- Server MyEclipse Tomcat v7.0 was unable to start within 45 seconds. If the server requires more time
- if选择分支语句
- MFC CListCtrl控件的基本使用
- 某东机试第二题
- 前端(第一节课 HTML、CSS 、JAVAscript的概念)
- iOS之UICollectionView自定义布局
- c/c++笔试、面试知识点(二)
- 服务器上配置SVN
- WEB第二天
- Android访问Http流媒体服务
- iOS之UITableView设置全屏分隔线