使用List_Control
VC++中listcontrol的用法
CListCtrl 使用技巧以下未经说明,listctrl默认view 风格为report相关类及处理函数MFC:CListCtrl类SDK:以“ListView_”开头的一些宏。
如ListView_InsertColumn1. CListCtrl 风格LVS_ICON: 为每个item显示大图标LVS_SMALLICON: 为每个item显示小图标LVS_LIST: 显示一列带有小图标的itemLVS_REPORT: 显示item详细资料直观的理解:windows资源管理器,“查看”标签下的“大图标,小图标,列表,详细资料2. 设置listctrl 风格及扩展风格LONG lStyle;lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口stylelStyle &= ~LVS_TYPEMASK; //清除显示方式位lStyle |= LVS_REPORT; //设置styleSetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//设置styleDWORD 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.SetItemT ext(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 szBuf[1024];LVITEM lvi;lvi.iItem = nItemIndex;lvi.iSubItem = 0;lvi.mask = LVIF_TEXT;lvi.pszText = szBuf;hTextMax = 1024;m_list.GetItem(&lvi);9. 得到listctrl的所有列的header字符串内容LVCOLUMN lvcol;char str[256];int nColNum;CString strColumnName[4];//假如有4列nColNum = 0;lvcol.mask = LVCF_TEXT;lvcol.pszText = str;hT extMax = 256;while(m_list.GetColumn(nColNum, &lvcol)){strColumnName[nColNum] = lvcol.pszText;nColNum++;}10. 使listctrl中一项可见,即滚动滚动条m_list.EnsureVisible(i, FALSE);11. 得到listctrl列数int nHeadNum = m_list.GetHeaderCtrl()->GetItemCount();12. 删除所有列方法一:while ( m_list.DeleteColumn (0))因为你删除了第一列后,后面的列会依次向上移动。
mfc listcontrol 控件使用总结整理
mfc listcontrol 控件使用总结整理MFC List Control控件是MFC框架中的一个常用控件,用于显示和管理列表数据。
以下是对MFC List Control控件使用的一些总结整理:1. 创建控件:通过在对话框资源中添加List Control控件进行创建,或者在代码中使用Create()函数动态创建。
2. 设置风格:可以通过代码设置控件的风格,如设置单选模式、多选模式、网格线等。
3. 设置列头:通过调用InsertColumn()函数来设置控件的列头,可以设置列标题、宽度等属性。
4. 添加项:可以通过调用InsertItem()函数来添加行(项),可以设置每个项的数据、图标等属性。
5. 设置子项:通过调用SetItemText()函数来设置每个项的子项的文本内容。
6. 获取选定项:可以通过调用GetNextItem()函数来获取当前选中项的索引,然后可以通过GetItemText()函数来获取选中项的内容。
7. 删除项:可以通过调用DeleteItem()函数来删除指定的项。
8. 排序:可以通过调用SortItems()函数来对List Control控件的内容进行排序。
9. 自定义绘制:可以通过重写OnCustomDraw()函数来实现对List Control控件的自定义绘制,如改变项的背景颜色、文本颜色等。
10. 列表视图:可以通过设置控件的样式为列表视图,来实现更复杂的数据展示和交互功能,如拖拽、排序、编辑等。
需要注意的是,MFC List Control控件的使用需要注意内存释放和资源管理,例如在动态创建控件时需要手动调用DeleteObject()函数来释放资源。
另外,对于大量数据的操作,可以考虑使用虚拟列表实现数据的延迟加载,以提高性能和响应速度。
mfc中listcontrol控件
MFC中ListControl控件介绍MFC(Microsoft Foundation Class)是一种用于开发Windows桌面应用程序的C++框架。
在MFC中,ListControl是一种常用的控件,用于以列表形式显示数据。
本文将介绍MFC中的ListControl控件,包括其基本功能、使用方法以及常见应用场景。
ListControl的基本功能ListControl控件通常用于显示大量数据,并提供滚动、排序和编辑等功能。
它可以容纳多列的数据,在每个单元格中显示文本、图标或其他类型的数据。
ListControl的创建与添加数据在MFC中,创建ListControl控件的方法如下: 1. 在对话框资源中添加一个ListControl控件; 2. 使用Class Wizard添加一个ListControl成员变量,保存对该控件的引用。
ListControl中的数据可以通过以下方式添加: 1. 使用InsertItem函数添加新的行; 2. 使用SetItemText函数设置每个单元格的文本。
ListControl的基本操作ListControl提供了一系列方法和消息来处理用户交互,并对列表数据进行操作。
以下是一些常见的基本操作: - 添加数据:使用InsertItem和SetItemText函数添加新行和设置单元格数据; - 删除数据:使用DeleteItem函数删除选定行; - 编辑数据:使用EditLabel函数编辑选定行的文本; - 排序数据:使用SortItems函数按列排序列表项; - 选择数据:使用SetItemState函数设置选中行; - 获取数据:使用GetItemText函数获取指定行和列的文本数据。
ListControl的高级功能除了基本功能外,ListControl还提供了一些高级功能,可以增强用户体验和数据展示效果:ListControl可以以图标形式显示数据,并提供多种视图模式,如大图标、小图标和列表视图。
mfc list control简单使用说明
mfc list control简单使用说明MFC(Microsoft Foundation Classes)是Microsoft提供的一个C++面向对象的应用程序框架,用于开发Windows应用程序。
MFC的List Control是其中一个常用的控件,用于展示和管理数据列表。
使用MFC List Control之前,需要先创建一个对话框或视图类,并在资源编辑器中添加一个List Control控件。
我们可以通过以下几个步骤简单地使用MFC List Control控件:1. 设置列标头:使用InsertColumn函数,我们可以设置List Control的列标头。
例如,如果我们想要一个包含“姓名”和“年龄”的列表,可以这样做:```cppm_listCtrl.InsertColumn(0, _T("姓名"), LVCFMT_LEFT, 100);m_listCtrl.InsertColumn(1, _T("年龄"), LVCFMT_LEFT, 100);```2. 添加数据项:使用InsertItem函数,我们可以在List Control中添加数据项。
每个数据项将代表列表中一行的数据。
例如,我们可以这样添加一个名为“张三”,年龄为25的数据项:```cppint nIndex = m_listCtrl.InsertItem(0, _T("张三"));m_listCtrl.SetItemText(nIndex, 1, _T("25"));```3. 更改数据项内容:使用SetItemText函数,我们可以修改List Control中数据项的内容。
例如,如果我们想修改“张三”的年龄为30,可以使用以下代码:```cppm_listCtrl.SetItemText(nIndex, 1, _T("30"));```4. 删除数据项:使用DeleteItem函数,我们可以删除List Control中的数据项。
mfc list control复选框的用法
mfc list control复选框的用法MFC(Microsoft Foundation Classes)提供了一种用于创建应用程序用户界面的C++类库。
MFC List Control是MFC库中的一个控件,用于显示和编辑多行列的文本或图标。
下面是MFC List Control复选框的用法:1. 创建MFC对话框应用程序或MFC窗口应用程序。
2. 打开资源编辑器,将一个List Control控件从工具栏拖放到对话框或窗口上。
3. 右键单击List Control控件,选择"属性",然后在属性窗口中设置List控件的样式为“Owner Draw Variable”。
4. 在类视图中双击对话框或窗口类,打开对应的.cpp文件。
5. 在对话框或窗口类的成员变量中添加一个List Control控件的变量,例如:CListCtrl m_listCtrl。
6. 在OnInitDialog或OnInitialUpdate函数中添加以下代码来设置List Control的列标题和样式:m_listCtrl.InsertColumn(0, _T("Column 1"), LVCFMT_LEFT, 100);m_listCtrl.InsertColumn(1, _T("Column 2"), LVCFMT_LEFT, 100);m_listCtrl.SetExtendedStyle(LVS_EX_CHECKBOXES);其中,InsertColumn函数用于插入列标题,第一个参数为列索引,第二个参数为列标题,第三个参数为列对齐方式,第四个参数为列宽度。
SetExtendedStyle 函数用于启用List Control的复选框功能。
7. 使用InsertItem函数添加列表项,使用SetItemText函数设置列表项的文本:int itemIndex = m_listCtrl.InsertItem(0, _T("Item 1"));m_listCtrl.SetItemText(itemIndex, 1, _T("Item 1 T ext"));其中,第一个参数为项索引,第二个参数为项文本。
mfc中listcontrol用法
mfc中listcontrol用法MFC中的List Control是一种典型的列表框控件,它可以显示多列数据,并具备排序、选择、编辑等功能。
这篇文章将会阐述MFC中List Control的用法,以帮助读者更好地理解和运用这个控件。
一、创建List Control在MFC中,可以使用控件向导创建List Control,具体步骤如下:1. 打开Visual Studio;2. 创建一个MFC应用程序;3. 在创建对话框的过程中,添加一个List Control控件;4. 在对话框的OnInitDialog函数中,添加以下代码:CListCtrl* pListCtrl =(CListCtrl*)GetDlgItem(IDC_LIST1);pListCtrl->InsertColumn(0, _T("列1"), LVCFMT_LEFT, 60);pListCtrl->InsertColumn(1, _T("列2"), LVCFMT_LEFT, 100);pListCtrl->InsertColumn(2, _T("列3"), LVCFMT_LEFT, 100);pListCtrl->InsertItem(0, _T("第一行"));pListCtrl->SetItemText(0, 1, _T("第一行第二列"));pListCtrl->SetItemText(0, 2, _T("第一行第三列"));二、添加数据在创建好List Control之后,就可以通过以下代码添加数据:CListCtrl* pListCtrl =(CListCtrl*)GetDlgItem(IDC_LIST1);CString strText;strText = _T("第二行");int nRow = pListCtrl->InsertItem(1, strText);strText = _T("第二行第二列");pListCtrl->SetItemText(nRow, 1, strText);strText = _T("第二行第三列");pListCtrl->SetItemText(nRow, 2, strText);三、排序List Control可以通过自带的“排序”功能,对列表中的数据进行排序。
VC++中listcontrol的用法
少将CListCtrl 使用技巧以下未经说明,listctrl默认view 风格为report相关类及处理函数MFC:CListCtrl类SDK:以“ListView_”开头的一些宏。
如ListView_InsertColumn1. CListCtrl 风格LVS_ICON: 为每个item显示大图标LVS_SMALLICON: 为每个item显示小图标LVS_LIST: 显示一列带有小图标的itemLVS_REPORT: 显示item详细资料直观的理解:windows资源管理器,“查看”标签下的“大图标,小图标,列表,详细资料2. 设置listctrl 风格及扩展风格LONG lStyle;lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口stylelStyle &= ~LVS_TYPEMASK; //清除显示方式位lStyle |= LVS_REPORT; //设置styleSetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//设置styleDWORD 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.SetItemT ext(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 szBuf[1024];LVITEM lvi;lvi.iItem = nItemIndex;lvi.iSubItem = 0;lvi.mask = LVIF_TEXT;lvi.pszText = szBuf;hTextMax = 1024;m_list.GetItem(&lvi);9. 得到listctrl的所有列的header字符串内容LVCOLUMN lvcol;char str[256];int nColNum;CString strColumnName[4];//假如有4列nColNum = 0;lvcol.mask = LVCF_TEXT;lvcol.pszText = str;hT extMax = 256;while(m_list.GetColumn(nColNum, &lvcol)){strColumnName[nColNum] = lvcol.pszText;nColNum++;}10. 使listctrl中一项可见,即滚动滚动条m_list.EnsureVisible(i, FALSE);11. 得到listctrl列数int nHeadNum = m_list.GetHeaderCtrl()->GetItemCount();12. 删除所有列方法一:while ( m_list.DeleteColumn (0))因为你删除了第一列后,后面的列会依次向上移动。
MFC中ListTab控件及ListControl控件使用
MFC中ListTab控件及ListControl控件使用在MFC中,List Tab控件和List Control控件是常用于显示列表数
据的控件。
本篇文章将详细介绍如何使用这两个控件。
一、List Tab控件
1. 在资源视图中,从工具箱中拖动一个TabControl控件到对话框上。
二、List Control控件
1. 在资源视图中,从工具箱中拖动一个List Control控件到对话框上。
2. 调整List Control控件的大小和位置,使其适应对话框的需要。
3. 在主对话框类中,添加一个成员变量,用于引用List Control控件。
可以使用Wizard中的成员变量向导自动生成相应的代码。
4. 在主对话框类的OnInitDialog(函数中,使用
ListCtrl.InsertColumn(函数添加列,并使用ListCtrl.InsertItem(函
数和ListCtrl.SetItemText(函数向List Control控件中插入数据和设
置每个单元格的内容。
7. 在主对话框类中的响应函数中,可以使用
ListCtrl.GetSelectionMark(函数获取当前选中的项的索引,使用ListCtrl.GetItemText(函数获取指定项指定列的文本内容。
总结:。
VC中使用ListCtrl和LVITEM 经验总结
VC中使用ListCtrl和LVITEM 经验总结(转)默认分类2009-10-04 22:22 阅读78 评论1字号:大中小VC中使用ListCtrl和LVITEM 经验总结(博客搬家)2008-08-04 12:19:54此文转至:/BlogView.asp?logID=961VC中使用ListCtrl和LVITEM 经验总结ListCtrl在工作中,常常用到,也常常看到大家发帖问怎么用这个控件,故总结了一下自己的使用经验,以供参考使用。
先注明一下,这里,我们用m_listctrl来表示一个CListCtrl的类对象,然后这里我们的ListCtrl都是report形式,至于其他的如什么大图标,小图标的暂时不讲,毕竟report是大众话的使用。
其次,我们这里用条款一,条款二来描述第一点,第二点,这个是参照《Effective C++》的叫法,俺觉得这么叫比较COOL :)条款一:设置ListCtrl的风格在CSDN上常常看到有人问怎么设置风格的,他们ListCtrl的样子是一个列表,有横条和竖条分界线,然后选中一行,要整一行都选中,而不是只有某一列被选中,等等,这里给一个比较全面的设置方法。
//获得原有风格DWORD dwStyle = ::GetWindowLong(m_listctrl.m_hWnd, GWL_STYLE);dwStyle &= ~(LVS_TYPEMASK);dwStyle &= ~(LVS_EDITLABELS);//设置新风格SetWindowLong(m_listctrl.m_hWnd, GWL_STYLE,dwStyle,|LVS_REPORT|LVS_NOLABELWRAP|LVS_SHOWSELALWAYS);//设置扩展风格DWORD styles =LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES; ListView_SetExtendedListViewStyleEx(m_listctrl.m_hWnd, styles,styles );其中LVS_EX_FULLROWSELECT就是前面说得整行选中LVS_EX_GRIDLINES网格线(只适用与report风格的listctrl)LVS_EX_CHECKBOXES前面加个checkboxpListCtrl->SetExtendedStyle( m_listctrl.GetExtendedStyle()|LVS_EX_SUBITEMIMAGES);这也是一个很重要的属性,这样的话,可以在列表中加ICON,记得windows的任务管理器吗,你想做得那样,这个属性也要加哦,这个我以后会讲的~条款二:加入列头这是一个比较实质的东西,给列表框分列,然后加上列头代码说话,来了TCHAR rgtsz[2][10] = {_T("列头1"), _T("列头2")};LV_COLUMN lvcolumn;CRect rect;m_listctrl.GetWindowRect(&rect);for(int i=0;i<2;i++){lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT| LVCF_WIDTH | LVCF_ORDER;lvcolumn.fmt = LVCFMT_LEFT;lvcolumn.pszText = rgtsz[i];lvcolumn.iSubItem = i;lvcolumn.iOrder = i;if(i==0){lvcolumn.cx = rect.Width()*3/5 ;}elselvcolumn.cx = rect.Width()*2/5;m_listctrl.InsertColumn(i, &lvcolumn);}这是插入两列的做法,你要插入20列??随便你,依样画葫芦~~lvcolumn.mask 中那个mask可以有各种属性,具体去看msdn吧,条款三:把记录,插入列表框中int nIndex = m_listctrl.GetItemCount();LV_ITEM lvitemAdd = {0};lvitemAdd.mask = LVIF_TEXT;lvitemAdd.iItem = nIndex ;lvitemAdd.iSubItem = 0;lvitemAdd.pszText =_T("毛毛1");;if (m_listctrl.InsertItem(&lvitemAdd) != -1){LV_ITEM lvitem = {0};lvitem.mask = LVIF_TEXT;lvitem.iItem = nIndex ;lvitem.iSubItem = 1;lvitem.pszText =_T("毛毛2");m_listctrl.SetItem(&lvitem);}nIndex 是当前的行数,然后把新的一行,插在最下面,条款四:给列表中插入图标在report格式中,也能插入图标继续代码说话m_image是个CImageList对象m_image.Create(16,16, TRUE|ILC_COLOR24, 3, 1);m_listctrl.SetImageList(&m_image,LVSIL_SMALL);然后调用CImageList的成员函数int CImageList::Add( HICON hIcon ); 把ICON插入到imagelist,然后在插入记录的时候lvitemAdd.mask = LVIF_TEXT;-》lvitemAdd.mask =LVIF_TEXT|LVIF_IMAGE然后添加一个lvitemAdd.iImage = n;这个n是imagelist中的序号,表示是具体的哪一个图标,list么,呵呵条款五:插入记录时使用额外的信息,lParam 的使用有时候,你想对于某一行,加入一些额外的信息,那么就可以使用这个lParammsdn是这么描述的Specifies the 32-bit value of the item我上次是为了在某一行加入一个信息,窗口句柄,然后是这么加的,int nIndex = m_listctrl.GetItemCount();LV_ITEM lvitemAdd = {0};lvitemAdd.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM; lvitemAdd.iItem = nIndex ;lvitemAdd.iSubItem = 0;lvitemAdd.pszText =_T("毛毛1");;lvitemAdd.iImage = n;lvitemAdd.lParam = (LPARAM)hwnd;(某个窗口的窗口句柄)if (m_listctrl.InsertItem(&lvitemAdd) != -1){LV_ITEM lvitem = {0};lvitem.mask = LVIF_TEXT;lvitem.iItem = nIndex ;lvitem.iSubItem = 1;lvitem.pszText =_T("毛毛2");m_listctrl.SetItem(&lvitem);}ok,这是一个比较全的例子的,又插ICON,又使用PARAM的条款六:点击列表框,获取选中行信息响应NM_CLICK消息,如果你有MSDN,可以看到,有专门关于listview的NM_CLICK的介绍void CMyDlg::OnItemClick(NMHDR* pNMHDR, LRESULT* pResult){// TODO: Add your control notification handler code hereint nItem = -1;LPNMITEMACTIVA TE lpNMItemActivate = (LPNMITEMACTIVATE)pNMHDR;if(lpNMItemActivate != NULL){nItem = lpNMItemActivate->iItem;}}现在nItem就是点击选中那行的index了,有了index,获取那行的信息还难吗?懒汉说:难,因为你还没讲,晕,那就继续说条款七:根据行的index,获取该行的信息直接上代码吧LV_ITEM lvitem = {0};lvitem.iItem = nIndex;lvitem.iSubItem = 0;lvitem.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;m_listctrl.GetItem(&lvitem)这样,就把nindex,第一列的信息取出来了,包括刚才我们加入的ICON,和那个额外信息(窗口句柄),比如我要获取窗口句柄,就可以hwnd = (HWND)lvitem.lParam;mask 用来指明你想获取那些信息具体可以查msdn中LVITEM Structure的定义和CListCtrl::GetItem条款八:用程序选中某一行,使之选中选中之m_listctrl.SetItemState(nIndex,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED); 不选中,取消选中之m_listctrl.SetItemState(nIndex,0,LVIS_SELECTED|LVIS_FOCUSED);条款九:获取当前所有选中的行(多选)这个,俺就比较懒了,抄msdn的代码吧,反正很简单Example// CListCtrl* pListCtrl = (CListCtrl*) GetDlgItem(IDC_YOURLISTCONTROL);ASSERT(pListCtrl != NULL);POSITION pos = pList->GetFirstSelectedItemPosition();if (pos == NULL)TRACE0("No items were selected!\n");else{while (pos){int nItem = pList->GetNextSelectedItem(pos);TRACE1("Item %d was selected!\n", nItem);// you could do your own processing on nItem here}}条款十:删除条款九中选中的行这个相对前面九个条款是比较麻烦的,因为如果你要删除多行的话。
ListCtrl控件数据动态修改(List Control)
:/KB/list/editing_subitems_in_listcontrol.aspx另自己写了一篇关于一些ListControl的基本操作(如何获得一项的值,如何选中一行而不是一列等)请查看:/anglecloudy/blog/item/d969fd29138093f999250a97.html Editing Sub-Items in List ControlBy s.prabhakarreddy本文全面介绍了如何编辑List Control里面的任何子项介绍内容有点多,译出来也没多大意思,大致就是说一个VC程序员会常常碰到List Control,List Control有很多方法可以显示数据,可List Control里默认的没有编辑功能,故在此智短文里,那个牛叉的人教你怎么实现这个功能。
这篇文章是基于VC MFC滴,用别的功具的娃们当然也可以看看,呵呵,不多说,先实现图上ok exit两个按钮:void CMultipleColumnsDlg::OK(){CDialog::EndDialog (0); // Add this line}void CMultipleColumnsDlg::OnExit(){CDialog::EndDialog (0); // Add this line}接下来添加一个ListCtrl控件,记得把ListCtrl的style设置成Report,这个是为了实现我们要多行显示的功能然后增加一个文本框Edit Box去掉它的Border style属性增加一个InsertItems() 成员函数,用来写入ListControl的显示内容void CMultipleColumnsDlg::InsertItems(){HWND hWnd = ::GetDlgItem(m_hWnd, IDC_LIST1);// Set the LVCOLUMN structure with the required// column informationLVCOLUMN list;list.mask = LVCF_TEXT |LVCF_WIDTH|LVCF_FMT |LVCF_SUBITEM;list.fmt = LVCFMT_LEFT;list.cx = 50;list.pszText = "S.No";list.iSubItem = 0;//Inserts the column::SendMessage(hWnd,LVM_INSERTCOLUMN,(WPARAM)0,(WPARAM)&list);list.cx = 100;list.pszText = "Name";list.iSubItem = 1;::SendMessage(hWnd ,LVM_INSERTCOLUMN,(WPARAM)1,(WPARAM)&list);list.cx = 100;list.pszText = "Address";list.iSubItem = 2;::SendMessage(hWnd ,LVM_INSERTCOLUMN,(WPARAM)1,(WPARAM)&list);list.cx = 100;list.pszText = "Country";list.iSubItem = 2;::SendMessage(hWnd ,LVM_INSERTCOLUMN,(WPARAM)1,(WPARAM)&list);// Inserts first Row with four columns .SetCell(hWnd,"1",0,0);SetCell(hWnd,"Prabhakar",0,1);SetCell(hWnd,"Hyderabad",0,2);SetCell(hWnd,"India",0,3);// Inserts second Row with four columns .SetCell(hWnd,"2",1,0);SetCell(hWnd,"Uday",1,1);SetCell(hWnd,"Chennai",1,2);SetCell(hWnd,"India",1,3);}自定义的SetCell( ) 函数,用来实现插入数据用的void CMultipleColumnsDlg::SetCell(HWND hWnd1,CString value, int nRow, int nCol){TCHAR szString [256];wsprintf(szString,value ,0);//Fill the LVITEM structure with the//values given as parameters.LVITEM lvItem;lvItem.mask = LVIF_TEXT;lvItem.iItem = nRow;lvItem.pszText = szString;lvItem.iSubItem = nCol;if(nCol >0)//set the value of listItem::SendMessage(hWnd1,LVM_SETITEM,(WPARAM)0,(WPARAM)&lvItem);else//Insert the value into ListListView_InsertItem(hWnd1,&lvItem);}//通过行和列得到项目里面的数据CString CMultipleColumnsDlg::GetItemText(HWND hWnd, int nItem, int nSubItem) const{LVITEM lvi;memset(&lvi, 0, sizeof(LVITEM));lvi.iSubItem = nSubItem;CString str;int nLen = 128;int nRes;do{nLen *= 2;hTextMax = nLen;lvi.pszText = str.GetBufferSetLength(nLen);nRes = (int)::SendMessage(hWnd,LVM_GETITEMTEXT, (WPARAM)nItem,(LPARAM)&lvi);str.ReleaseBuffer();return str;}//为窗口类添加两个成员变量:int nItem, nSubItem;用Class wizard 添加NM_CLICK 响应,当用户点击任何位置时,就会对应出现一个Edit Box,并可以修改数据void CMultipleColumnsDlg::OnClickList(NMHDR* pNMHDR, LRESULT* pResult){Invalidate();HWND hWnd1 = ::GetDlgItem (m_hWnd,IDC_LIST1);LPNMITEMACTIVATE temp = (LPNMITEMACTIVATE) pNMHDR;RECT rect;//get the row numbernItem = temp->iItem;//get the column numbernSubItem = temp->iSubItem;if(nSubItem == 0 || nSubItem == -1 || nItem == -1)return ;//Retrieve the text of the selected subItem//from the listCString str = GetItemText(hWnd1,nItem ,nSubItem);RECT rect1,rect2;// this macro is used to retrieve the Rectanle// of the selected SubItemListView_GetSubItemRect(hWnd1,temp->iItem,temp->iSubItem,LVIR_BOUNDS,&rect);//Get the Rectange of the listControl::GetWindowRect(temp->hdr.hwndFrom,&rect1);//Get the Rectange of the Dialog::GetWindowRect(m_hWnd,&rect2);int x=rect1.left-rect2.left;int y=rect1.top-rect2.top;if(nItem != -1)::SetWindowPos(::GetDlgItem(m_hWnd,IDC_EDIT1),HWND_TOP,rect.left+x,rect.top+4,rect.right-rect.left - 3,rect.bottom-rect.top -1,NULL);::ShowWindow(::GetDlgItem(m_hWnd,IDC_EDIT1),SW_SHOW);::SetFocus(::GetDlgItem(m_hWnd,IDC_EDIT1));//Draw a Rectangle around the SubItem::Rectangle(::GetDC(temp->hdr.hwndFrom),rect.left,rect.top-1,rect.right,rect.bottom);//Set the listItem text in the EditBox::SetWindowText(::GetDlgItem(m_hWnd,IDC_EDIT1),str);*pResult = 0;}To handle the ENTER key we need to write the virtual function OnOk(响应ENTER 键)afx_msg void OnOK();In MultipleColumnsDlg.cpp write the following code.// This function handles the ENTER keyvoid CMultipleColumnsDlg::OnOK(){CWnd* pwndCtrl = GetFocus();// get the control ID which is// presently having the focusint ctrl_ID = pwndCtrl->GetDlgCtrlID();CString str;switch (ctrl_ID){ //if the control is the EditBoxcase IDC_EDIT1://get the text from the EditBoxGetDlgItemText(IDC_EDIT1,str);//set the value in the listContorl with the//specified Item & SubItem valuesSetCell(::GetDlgItem (m_hWnd,IDC_LIST1),str,nItem,nSubItem);::SendDlgItemMessage(m_hWnd,IDC_EDIT1,WM_KILLFOCUS,0,0);::ShowWindow(::GetDlgItem(m_hWnd,IDC_EDIT1),SW_HIDE);break;default:break;}}最后一步在OnInitDialog 中设置List Control的样式ListView_SetExtendedListViewStyle(::GetDlgItem(m_hWnd,IDC_LIST1),LVS_EX_FULLROWSELECT |LVS_EX_GRIDLINES);InsertItems();::ShowWindow(::GetDlgItem(m_hWnd,IDC_EDIT1),SW_HIDE);IntroductionAlmost every one of us who are programming in VC++ , will come across the List control. There are many cases where there is a need to represent data in List Control in multiple columns. By default it is not possible to modify the data in the List control itself. In this small article I am putting a simple way to edit any value in any column in a Report style List control. The logic here is simple, whenever user clicks on an sub-item which he wants to modify at that place I am displaying a edit box and allowing to modify the value. Once modified and by clicking the ENTER key, the updated value is set in the List control. Here I am assuming the user is familiar with VC++ and using Class WizardImplementation steps:ing MFC AppWizard, create a Dialog Based application. Give theapplication name as MultipleColumns. By default the wizard adds OK andCancel buttons to the Dialog, Remove these two buttons.2.Now Add a List-Control and in properties change the style to Report, thisstyle is necessary if we want multiple columns3.Add two buttons to the Dialog and name them as OK and Exit4.Add one Edit box and in the properties remove the Border styleing the Class Wizard add the message handlers for the OK and ExitButtons. Add the following code to those functionsCollapse Copy Codevoid CMultipleColumnsDlg::OK(){CDialog::EndDialog (0); // Add this line}Collapse Copy Codevoid CMultipleColumnsDlg::OnExit(){CDialog::EndDialog (0); // Add this line}6.Add a function called InsertItems() to the CMulipleColumnsDlg class.Collapse Copy Codevoid InsertItems();In the function handler add the following codeCollapse Copy Code// This function inserts the default values// into the listControlvoid CMultipleColumnsDlg::InsertItems(){HWND hWnd = ::GetDlgItem(m_hWnd, IDC_LIST1);// Set the LVCOLUMN structure with the required// column informationLVCOLUMN list;list.mask = LVCF_TEXT |LVCF_WIDTH|LVCF_FMT |LVCF_SUBITEM;list.fmt = LVCFMT_LEFT;list.cx = 50;list.pszText = "S.No";list.iSubItem = 0;//Inserts the column::SendMessage(hWnd,LVM_INSERTCOLUMN,(WPARAM)0,(WPARAM)&list);list.cx = 100;list.pszText = "Name";list.iSubItem = 1;::SendMessage(hWnd ,LVM_INSERTCOLUMN,(WPARAM)1,(WPARAM)&list);list.cx = 100;list.pszText = "Address";list.iSubItem = 2;::SendMessage(hWnd ,LVM_INSERTCOLUMN,(WPARAM)1,(WPARAM)&list);list.cx = 100;list.pszText = "Country";list.iSubItem = 2;::SendMessage(hWnd ,LVM_INSERTCOLUMN,(WPARAM)1,(WPARAM)&list);// Inserts first Row with four columns .SetCell(hWnd,"1",0,0);SetCell(hWnd,"Prabhakar",0,1);SetCell(hWnd,"Hyderabad",0,2);SetCell(hWnd,"India",0,3);// Inserts second Row with four columns .SetCell(hWnd,"2",1,0);SetCell(hWnd,"Uday",1,1);SetCell(hWnd,"Chennai",1,2);SetCell(hWnd,"India",1,3);// Inserts third Row with four columns .SetCell(hWnd,"3",2,0);SetCell(hWnd,"Saradhi",2,1);SetCell(hWnd,"Bangolore",2,2);SetCell(hWnd,"India",2,3);// Inserts fourth Row with four columns .SetCell(hWnd,"4",3,0);SetCell(hWnd,"Surya",3,1);SetCell(hWnd,"Calcutta",3,2);SetCell(hWnd,"India",3,3);}7.Add another function called SetCell( ) to the CMultipleColumnsDlgclassCollapse Copy Codevoid SetCell(HWND hWnd1, CString value, int nRow, int nCol);In the function handler add the following codeCollapse Copy Code// This function set the text in the specified// SubItem depending on the Row and Column valuesvoid CMultipleColumnsDlg::SetCell(HWND hWnd1,CString value, int nRow, int nCol){TCHAR szString [256];wsprintf(szString,value ,0);//Fill the LVITEM structure with the//values given as parameters.LVITEM lvItem;lvItem.mask = LVIF_TEXT;lvItem.iItem = nRow;lvItem.pszText = szString;lvItem.iSubItem = nCol;if(nCol >0)//set the value of listItem::SendMessage(hWnd1,LVM_SETITEM,(WPARAM)0,(WPARAM)&lvItem);else//Insert the value into ListListView_InsertItem(hWnd1,&lvItem);}8.Add one more function called GetItemText() to the same ClassCollapse Copy CodeCString GetItemText(HWND hWnd, int nItem, int nSubItem) const;Inside the function add the following codeCollapse Copy Code//this function will returns the item//text depending on the item and SubItem IndexCString CMultipleColumnsDlg::GetItemText(HWND hWnd, int nItem, int nSubItem) const{LVITEM lvi;memset(&lvi, 0, sizeof(LVITEM));lvi.iSubItem = nSubItem;CString str;int nLen = 128;int nRes;do{nLen *= 2;hTextMax = nLen;lvi.pszText = str.GetBufferSetLength(nLen);nRes = (int)::SendMessage(hWnd,LVM_GETITEMTEXT, (WPARAM)nItem,(LPARAM)&lvi);str.ReleaseBuffer();return str;}9.Also add two member variables to the CMultipleColumnsDlg class whichare of type intCollapse Copy Codeint nItem, nSubItem;10.From the Class wizard add NM_CLICK notification to the List control. Insidethe function handler write the following codeCollapse Copy Code//This function Displays an EditBox at the position//where user clicks on a particular SubItem with//Rectangle are equal to the SubItem, thus allows to//modify the valuevoid CMultipleColumnsDlg::OnClickList(NMHDR* pNMHDR, LRESULT* pResult){Invalidate();HWND hWnd1 = ::GetDlgItem (m_hWnd,IDC_LIST1);LPNMITEMACTIVATE temp = (LPNMITEMACTIVATE) pNMHDR;RECT rect;//get the row numbernItem = temp->iItem;//get the column numbernSubItem = temp->iSubItem;if(nSubItem == 0 || nSubItem == -1 || nItem == -1)return ;//Retrieve the text of the selected subItem//from the listCString str = GetItemText(hWnd1,nItem ,nSubItem);RECT rect1,rect2;// this macro is used to retrieve the Rectanle// of the selected SubItemListView_GetSubItemRect(hWnd1,temp->iItem,temp->iSubItem,LVIR_BOUNDS,&rect);//Get the Rectange of the listControl::GetWindowRect(temp->hdr.hwndFrom,&rect1);//Get the Rectange of the Dialog::GetWindowRect(m_hWnd,&rect2);int x=rect1.left-rect2.left;int y=rect1.top-rect2.top;if(nItem != -1)::SetWindowPos(::GetDlgItem(m_hWnd,IDC_EDIT1),HWND_TOP,rect.left+x,rect.top+4,rect.right-rect.left - 3,rect.bottom-rect.top -1,NULL);::ShowWindow(::GetDlgItem(m_hWnd,IDC_EDIT1),SW_SHOW);::SetFocus(::GetDlgItem(m_hWnd,IDC_EDIT1));//Draw a Rectangle around the SubItem::Rectangle(::GetDC(temp->hdr.hwndFrom),rect.left,rect.top-1,rect.right,rect.bottom);//Set the listItem text in the EditBox::SetWindowText(::GetDlgItem(m_hWnd,IDC_EDIT1),str);*pResult = 0;}11.To handle the ENTER key we need to write the virtual function OnOk in theMultipleColumnsDlg.h, so add the following as protected memberCollapse Copy Codeafx_msg void OnOK();In MultipleColumnsDlg.cpp write the following code.Collapse Copy Code// This function handles the ENTER keyvoid CMultipleColumnsDlg::OnOK(){CWnd* pwndCtrl = GetFocus();// get the control ID which is// presently having the focusint ctrl_ID = pwndCtrl->GetDlgCtrlID();CString str;switch (ctrl_ID){ //if the control is the EditBoxcase IDC_EDIT1://get the text from the EditBoxGetDlgItemText(IDC_EDIT1,str);//set the value in the listContorl with the//specified Item & SubItem valuesSetCell(::GetDlgItem (m_hWnd,IDC_LIST1),str,nItem,nSubItem);::SendDlgItemMessage(m_hWnd,IDC_EDIT1,WM_KILLFOCUS,0,0);::ShowWindow(::GetDlgItem(m_hWnd,IDC_EDIT1),SW_HIDE);break;default:break;}}12.The last step in the implementation is add the following code in side theOnInitDialog functionCollapse Copy Code//Set the style to listControlListView_SetExtendedListViewStyle(::GetDlgItem(m_hWnd,IDC_LIST1),LVS_EX_FULLROWSELECT |LVS_EX_GRIDLINES);InsertItems();::ShowWindow(::GetDlgItem(m_hWnd,IDC_EDIT1),SW_HIDE);。
mfc的listctrl使用
mfc的listctrl使用MFC(Microsoft Foundation Classes)是微软提供的一组用于简化Windows应用程序开发的类库。
ListCtrl是MFC提供的一个控件,用于显示列表数据。
以下是使用MFC的ListCtrl控件的一些基本步骤:1、添加ListCtrl控件:在对话框资源中,右键单击对话框编辑器,选择"添加控件",然后从控件列表中选择"ListCtrl"。
2、初始化ListCtrl控件:在对话框类的DoDataExchange函数中,使用DDX_Control宏初始化ListCtrl控件。
例如:cppvoid CMyDialog::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CMyDialog)DDX_Control(pDX, IDC_LISTCTRL, m_listCtrl);//}}AFX_DATA_MAP}3、添加列头:使用InsertColumn函数添加列头。
例如:cppvoid CMyDialog::OnPaint(){CPaintDC dc(this); // device context for painting// TODO: 在此处添加消息处理程序代码m_listCtrl.InsertColumn(0, _T("Column 1"), LVCFMT_LEFT, 80);m_listCtrl.InsertColumn(1, _T("Column 2"), LVCFMT_LEFT, 120);//...}4、添加行数据:使用InsertItem函数添加行数据。
例如:cppvoid CMyDialog::OnButtonAdd(){// TODO: 在此处添加消息处理程序代码LVITEM lvItem;lvItem.iItem = m_listCtrl.GetItemCount();lvItem.iSubItem = 0;lvItem.mask = LVIF_TEXT;hTextMax = MAX_PATH;lvItem.pszText = new TCHAR[MAX_PATH];lvItem.lParam = 0;lvItem.iImage = 0;lvItem.iIndent = 0;lvItem.iGroupId = 0;lvItem.bNote = FALSE;lvItem.iSelect = FALSE;lvItem.iState = 0;lvItem.dwItemData = 0;olumns = 2; // number of columns to span (0 for no spanning) lvItem.puColumns = NULL; // array of column indices to span (NULL for no spanning)m_listCtrl.InsertItem(&lvItem); // insert the item into the list view control (the actual call that inserts the item)}。
mfc的listctrl使用
mfc的listctrl使用摘要:1.MFC 的ListCtrl 简介2.ListCtrl 的基本操作3.ListCtrl 的常用属性4.ListCtrl 的事件处理5.ListCtrl 的示例代码正文:一、MFC 的ListCtrl 简介MFC(Microsoft Foundation Class)是微软提供的一个用于开发Windows 应用程序的类库。
在MFC 中,ListCtrl 是一个常用的控件,用于显示一个列表,允许用户进行选择和编辑操作。
ListCtrl 控件的功能强大,使用灵活,广泛应用于各种应用程序中。
二、ListCtrl 的基本操作1.创建ListCtrl 控件在MFC 应用程序中,可以通过创建一个CListCtrl 对象来创建一个ListCtrl 控件。
例如:```cppCListCtrl m_listCtrl;```2.插入数据可以使用`InsertItem()`方法向ListCtrl 中插入数据。
例如:```cppm_listCtrl.InsertItem(0, _T("Item 1"));m_listCtrl.InsertItem(1, _T("Item 2"));```3.删除数据可以使用`DeleteItem()`方法从ListCtrl 中删除数据。
例如:```cppm_listCtrl.DeleteItem(0);```4.选择数据可以使用`SetCurSel()`方法设置当前选择的数据。
例如:```cppm_listCtrl.SetCurSel(0);```5.获取选中数据可以使用`GetCurSel()`方法获取当前选中的数据。
例如:```cppint nSel = m_listCtrl.GetCurSel();CString strSel = m_listCtrl.GetItemText(nSel, 0);```三、ListCtrl 的常用属性1.ListCtrl 的样式ListCtrl 的样式可以通过`SetStyle()`方法设置。
controller list参数
controller list参数在控制系统中,controller list(控制器列表)是指所有可用的控制器或控制模块,它们可以对系统进行控制和监控。
在此处,我们将详细介绍controller list参数的含义、作用和实现方法。
1. controller list参数的含义和作用controller list参数通常包括以下内容:- 控制器名称:每个控制器都有一个唯一的名称。
- 控制器类型:指控制器的种类和工作方式,如PID控制器、模糊控制器、神经网络控制器等。
- 控制器输入和输出:指控制器接受的输入和输出信号,如传感器信号、设定值、控制信号等。
- 控制器参数:指控制器的参数,如比例系数、积分时间、微分时间等。
- 控制器状态:指控制器的当前工作状态,如启动、停止、自动、手动等。
controller list参数主要作用是管理整个控制系统中所有控制器的信息,并与其他模块或子系统进行交互和通信。
当需要对某个过程进行控制时,系统会根据控制策略和目标要求选择相应的控制器,并将控制信号传递给执行机构,控制过程的进程。
controller list参数还可以用于系统诊断、参数调整和优化控制等方面。
可以通过获取控制器的输入和输出信号,对控制效果进行评估和改进;可以根据不同的控制需求和场景,选择最适合的控制器类型和参数组合,提高控制精度和效率;可以对控制器进行故障分析和维护,保证控制系统的可靠性和稳定性。
2. 实现controller list参数的方法实现controller list参数通常需要以下步骤:- 设计控制器模块:确定控制器种类、输入输出信号和参数设置等,编写相应的控制器代码。
- 控制器注册:将控制器名称和类型信息添加到controller list中。
- 控制器调用:根据需求从controller list中选择相应的控制器,并传递输入信号,获取输出信号。
- 控制器更新:通过对比实际输出信号和期望输出信号,对控制器参数进行调整和优化,更新controller list中的控制器状态和参数。
listcontrol控件用法
listcontrol控件用法List Control控件是一个可用于显示和管理数据的Windows控件。
它提供了一种在列表中显示多个项目和对项目进行操作的方式。
以下是关于List Control控件的用法的详细解释。
一、List Control控件的基本用法2. 设置样式:通过设置控件的样式,可以控制List Control的外观和行为。
比如可以选择单选或多选模式,设置是否显示网格线等。
3. 添加列:使用InsertColumn函数可以添加列,每个列表项可以有多个列。
可以设置列的宽度、标题、对齐方式等属性。
4. 添加项:使用InsertItem函数可以向List Control控件中添加项。
可以设置每个列对应的文本、图标、状态等。
6. 删除项:使用DeleteItem函数可以删除选定的项。
7. 排序:可以通过SortItems函数对列表项进行排序,根据指定的列和排序方式进行排序。
8. 选择项:可以通过SetItemState函数设置列表项的选中状态,可以选择单个或多个项。
9. 获取项的数据:使用GetItemText函数可以获取列表项的文本值,也可以使用GetItemData函数获取项的附加数据。
二、List Control控件的高级用法1. 图标视图:通过设置控件的样式为LVS_ICON,可以在List Control中显示项目的图标。
可以使用SetImageList函数来设置图标显示时使用的图像列表。
2. 详细视图:通过设置控件的样式为LVS_REPORT,可以在List Control中以表格形式显示项目的详细信息。
可以使用SetExtendedStyle 函数设置列表的扩展样式。
3. 多选模式:通过设置控件的样式为LVS_MULTIPLESEL,可以启用多选模式。
可以使用GetSelectedCount和GetSelectedItem函数获取选中的项。
4. 拖放操作:通过处理控件的通知消息,可以实现拖放操作。
ListControl控件技巧总汇
ListControl控件技巧总汇一、基本使用1. 创建List Control控件:使用CListCtrl类的Create函数来创建List Control控件,并指定样式。
2. 设置List Control控件的样式:使用SetExtendedStyle函数来设置List Control控件的扩展样式,例如设置带有网格线、可以选择多行等等。
3. 添加列表项:使用InsertItem函数来添加列表项,可以指定列表项的文本和图标等属性。
4. 设置列标题:使用InsertColumn函数来设置列标题,可以指定列的索引、宽度、文本等属性。
二、列表项操作1. 删除列表项:使用DeleteItem函数来删除指定索引的列表项。
2. 修改列表项:使用SetItemText函数来修改指定索引的列表项的文本。
3. 获取列表项:使用GetItemText函数来获取指定索引的列表项的文本。
4. 设置列表项属性:使用SetItemData函数来设置列表项的用户数据,可以将数据与列表项关联起来。
三、列操作1. 删除列:使用DeleteColumn函数来删除指定索引的列。
2. 移动列:使用SetColumnOrderArray函数来移动列的顺序。
3. 调整列宽:使用SetColumnWidth函数来调整列的宽度。
四、列表样式修改1. 修改行高:使用SetItemHeight函数来修改列表项的行高。
2. 修改列宽:使用SetColumnWidth函数来修改列的宽度。
3.绘制单元格背景:使用NM_CUSTOMDRAW消息来绘制列表项的背景,可以自定义背景色或者绘制图标。
五、排序功能1. 启用排序:使用EnableHeaderSorting函数来启用列表项的排序功能。
2.排序回调:使用排序回调函数来自定义排序的规则。
3. 刷新列表:使用SortItems函数来刷新列表,使得排序生效。
六、自定义绘制1.自定义绘制列表项:使用NM_CUSTOMDRAW消息来自定义绘制列表项的外观,例如修改字体、颜色等。
list_control_使用技巧
c++:list control的用法ListControl列表控件可以看作是功能增强的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:为分配给该列的列索引。
MFC中ListCtrl的用法
MFC中ListCtrl的用法MFC中的列表视图控件CListCtrl2010-04-21 10:06一、在Windows应用程序中添加ListControl控件的几种方法1、在对话框中添加控件:创建对话框应用程序,在资源视图中添加对话框。
如下图所示,在控件工具条中选择ListControl控件添加到对话框中,并调整控件尺寸。
在ListControl控件的属性页中设置控件样式(Styles)和扩展样式等。
为了显示详细数据信息,可以设置控件的显示风格为报表视图(Report)。
为了在对话框中使用控件,需要在ClassWizard中为对话框类添加控件成员变量,如下图所示:执行以上操作后,系统自动添加了一个ClistControl对象,并与ListControl 控件资源关联,相关代码如下:// ListDialogDlg.h : header file......public:CListCtrl m_cListCtrl;......// ListDialogDlg.cpp : implementation file......void CListDialogDlg::DoDataExchange(CDataExchange* pDX) {CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CListDialogDlg)DDX_Control(pDX, IDC_LIST_CTRL, m_cListCtrl);//}}AFX_DATA_MAP}......因为本例只为演示在对话框中添加ListControl控件,所以只在对话框初始化消息函数中添加了以下显示控件的示例代码(代码含义请参照MSDN文献):BOOL CListDialogDlg::OnInitDialog(){CDialog::OnInitDialog();......// TODO: Add extra initialization hereDWORD exstyle = m_cListCtrl.GetExtendedStyle();m_cListCtrl.SetExtendedStyle(exstyle | LVS_EX_FULLROWSELECT |LVS_EX_GRIDLINES |LVS_EX_CHECKBOXES | WS_EX_STATICEDGE );CRect rect;m_cListCtrl.GetClientRect(&rect);int nColInterval = rect.Width()/5;m_cListCtrl.InsertColumn(0, _T("Item Name"), LVCFMT_LEFT, nColInterval*3);m_cListCtrl.InsertColumn(1, _T("Value"), LVCFMT_LEFT, nColInterval); m_cListCtrl.InsertColumn(2, _T("Time"), LVCFMT_LEFT,rect.Width()-4*nColInterval);m_cListCtrl.InsertItem(0,"name");m_cListCtrl.SetItemText(0,1,"value");m_cListCtrl.SetItemText(0,2,"time");......return TRUE; // return TRUE unless you set the focus to a control}2、在单文档视图中自行添加ListControl控件:创建单文档应用程序,如下图所示为视图类添加CListCtrl对象成员变量:如下图所示,在资源视图中打开String Table资源,在右键菜单中选择new string,为将要创建的ListControl控件添加资源编号:为创建和显示控件,在视图的初始化消息函数中添加如下代码:void CAddListView::OnInitialUpdate(){CView::OnInitialUpdate();// TODO: Add your specialized code here and/or call the base classm_cListCtrl.Create( LVS_REPORT,CRect(0,0,800,600),this,IDC_ LISTCTRL);m_cListCtrl.ModifyStyle(0,LVS_REPORT|LVS_SHOWSELALWAYS|L VS_SORTASCEND ING);//m_cListCtrl.SendMessage(LVM_SETEXTENDEDLISTVIEWST YLE,0,LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_CHECK BOXES);m_cListCtrl.ShowWindow(SW_SHOW);CRect rect;m_cListCtrl.GetClientRect(&rect);int nColInterval = rect.Width()/5;m_cListCtrl.InsertColumn(0, _T("Item Name"), LVCFMT_LEFT, nColInterval*3);m_cListCtrl.InsertColumn(1, _T("Value"), LVCFMT_LEFT, nColInterval); m_cListCtrl.InsertColumn(2, _T("Time"), LVCFMT_LEFT,rect.Width()-4*nColInterval);m_cListCtrl.InsertItem(0,"name");m_cListCtrl.SetItemText(0,1,"value");m_cListCtrl.SetItemText(0,2,"time");}3、在ListView视图中显示ListControl控件:创建单文档应用程序,如下图所示,在选择窗口视图类型时,选择CListView视图:在视图类的初始化消息函数中添加如下显示控件的代码:void CTestlistView::OnInitialUpdate(){CListView::OnInitialUpdate();CDC* dc = GetDC();TEXTMETRIC tm;dc->GetTextMetrics(&tm);GetListCtrl().ModifyStyle(0,LVS_REPORT|LVS_SHOWSELALW AYS|LVS_SORTASCE NDING);GetListCtrl().SendMessage(LVM_SETEXTENDEDLISTVIEWSTY LE,0,LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_CHECK BOXES|LVS_EX_TRACKS ELECT);GetListCtrl().InsertColumn(0,"Name",LVCFMT_LEFT,30*tm.tm AveCharWidth, 0);GetListCtrl().InsertColumn(1,"Comment",LVCFMT_LEFT,70*t m.tmAveCharWid th,1);// TODO: You may populate your ListView with items by directly accessing // its list control through a call to GetListCtrl().}二、为ListControl控件添加消息处理函数1、关于ListControl控件消息在ListControl控件中有以下消息(通知)可以发送:NM_CLICK、NM_DBLCLK、NM_RCLICK、LVN_COLUMNCLICK、HDN_ITEMCLICK等。
设置listctrl行高
设置listctrl行高解决方案:1. 设置List Control的属性 Owen Draw Fixed.2. 自定义CMyListCtrl, 继承于CListCtrl,并重载CListCtrl::DrawItem.必须重载DrawItem函数,而不能自己处理WM_DRAWITEM,否则MFC处理时运行到CListCtrl::DrawItem会抱错。
( 此函数的内容只有一条语句: ASSERT(FALSE),所以,坚决不能运行^_^)3. 为List Control所在的对话框添加对WM_MEASUREITEM消息的处理OnMeasureItem。
在响应过程中修改结构中的itemHeight 参数。
注意: 不能简单地在CMyListCtrl中响应WM_MEASUREITEM消息,原因很简单,它根本收不到此消息。
如果要更好的实现,可以提供一个CMyListCtrl::MeasureItem的函数,在对话框的消息OnMeasureItem中,调用此方法。
以下DrawItem实现片断:void CMyListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){TCHAR lpBuffer[256];LV_ITEM lvi;lvi.mask = LVIF_TEXT | LVIF_PARAM ;lvi.iItem = lpDrawItemStruct->itemID ;lvi.iSubItem = 0;lvi.pszText = lpBuffer ;hTextMax = sizeof(lpBuffer);VERIFY(GetItem(&lvi));LV_COLUMN lvc, lvcprev ;::ZeroMemory(&lvc, sizeof(lvc));::ZeroMemory(&lvcprev, sizeof(lvcprev));lvc.mask = LVCF_WIDTH | LVCF_FMT;lvcprev.mask = LVCF_WIDTH | LVCF_FMT;for ( int nCol=0; GetColumn(nCol, &lvc); nCol++){if ( nCol > 0 ){// Get Previous Column Width in order to move the next display itemGetColumn(nCol-1, &lvcprev) ;lpDrawItemStruct->rcItem.left += lvcprev.cx ;lpDrawItemStruct->rcItem.right += lpDrawItemStruct->rcItem.left ;}// Get the text::ZeroMemory(&lvi, sizeof(lvi));lvi.iItem = lpDrawItemStruct->itemID;lvi.mask = LVIF_TEXT | LVIF_PARAM;lvi.iSubItem = nCol;lvi.pszText = lpBuffer;hTextMax = sizeof(lpBuffer);VERIFY(GetItem(&lvi));CDC* pDC;pDC = CDC::FromHandle(lpDrawItemStruct->hDC);if ( lpDrawItemStruct->itemState & ODS_SELECTED ){pDC->FillSolidRect(&lpDrawItemStruct->rcItem, GetSysColor(COLOR_HIGHLIGHT)) ;pDC->SetT extColor(GetSysColor(COLOR_HIGHLIGHTTEXT)) ;}else{pDC->FillSolidRect(&lpDrawItemStruct->rcItem, GetSysColor(COLOR_WINDOW)) ;pDC->SetT extColor(GetSysColor(COLOR_WINDOWTEXT)) ;}pDC->SelectObject(GetStockObject(DEFAULT_GUI_FONT));UINT uFormat = DT_LEFT ;::DrawText(lpDrawItemStruct->hDC, lpBuffer, strlen(lpBuffer), &lpDrawItemStruct->rcItem, uFormat) ;pDC->SelectStockObject(SYSTEM_FONT) ;}}以上代码来自codeproject:其上有一种解决方案如下,第1,2步相同,最后则如下处理:3. 在CMyListCtrl的MESSAGE_MAP中手动添加如下宏: ON_WM_MEASUREITEM_REFLECT()4. 重载CMyListCtrl::MeasureItem函数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MFC如何使用List Control以下未经说明,listctrl默认view 风格为report相关类及处理函数MFC:CListCtrl类SDK:以“ListView_”开头的一些宏。
如ListView_InsertColumn --------------------------------------------------------------------------------1. CListCtrl 风格LVS_ICON: 为每个item显示大图标LVS_SMALLICON: 为每个item显示小图标LVS_LIST: 显示一列带有小图标的itemLVS_REPORT: 显示item详细资料直观的理解:windows资源管理器,“查看”标签下的“大图标,小图标,列表,详细资料”--------------------------------------------------------------------------------2. 设置listctrl 风格及扩展风格LONG lStyle;lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口stylelStyle &= ~LVS_TYPEMASK; //清除显示方式位lStyle |= LVS_REPORT; //设置styleSetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//设置styleDWORD 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 szBuf[1024];LVITEM lvi;lvi.iItem = nItemIndex;lvi.iSubItem = 0;lvi.mask = LVIF_TEXT;lvi.pszText = szBuf;hTextMax = 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 str[256];int nColNum;CString strColumnName[4];//假如有4列nColNum = 0;lvcol.mask = LVCF_TEXT;lvcol.pszText = str;hTextMax = 256;while(m_list.GetColumn(nColNum, &lvcol)){strColumnName[nColNum] = 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 hereCString 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/introductio n/article.php/c919/--------------------------------------------------------------------------------20. listctrl的subitem添加图标m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES);m_list.SetItem(..); //具体参数请参考msdn--------------------------------------------------------------------------------21. 在CListCtrl显示文件,并根据文件类型来显示图标网上找到的代码,shareBOOL CTest6Dlg::OnInitDialog(){CDialog::OnInitDialog();HIMAGELIST himlSmall;HIMAGELIST himlLarge;SHFILEINFO sfi;char cSysDir[MAX_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 sizeif (filefind.FindFile(lpszFileName)){filefind.FindNextFile();strSize.Format("%d", filefind.GetLength());}elsestrSize = "0";// split path and filenameCString strFileName = lpszFileName;CString strPath;int nPos = strFileName.ReverseFind('\\');if (nPos != -1){strPath = strFileName.Left(nPos);strFileName = strFileName.Mid(nPos + 1);}// insert to listint 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第一列始终居左的问题解决办法:把第一列当一个虚列,从第二列开始插入列及数据,最后删除第一列。