Clistcontrl用法1
- 格式:doc
- 大小:43.50 KB
- 文档页数:8
CListCtrl的使用完全指南1. ListCtrl 风格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<="" bdsfid="114" i="" p="">{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<="" bdsfid="127" i="" p="">{if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED ) {str.Format(_T("选中了第%d行"), i);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;/doc/b5f97638580216fc700afd7e.htmlhTex tMax = 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;/doc/b5f97638580216fc700afd7e.htmlhTex tMax = 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))因为你删除了第一列后,后面的列会依次向上移动。
CListCtrl用法一、CListCtrl在MFC中共有四种view可供选择,每种view用不同的方式显示列表的内容。
· 图标视图(Icon view)每一项以全尺寸图标(32×32像素)出现,下面有一个标签。
用户可在列表视图窗口拖动项到任意位置。
· 小图标视图(Small icon view)视图每一项以小图标(16×16像素)出现,右边有一个标签。
用户可在列表视图窗口拖动项到任意位置。
· 列表视图(List view)每一项以小图标出现,下面有一个标签。
项按列排列,不能拖动到列表视图窗口的任何位置。
· 报表视图(Report view)每一项在本行上出现,右边有排列成列的附加信息。
最左边的列包含小图标和标签,下一列包含应用指定的子项。
二、使用List Control控件有两种方法。
1.在对话框体上添加,直接从工具箱里点List Control拖拉即可,在属性里view项设置视图类型。
CListCtrl *pMyList;pMyList = (CListCtrl*)GetDlgItem(IDC_LIST);2.无对话框体,直接显示在程序初始视图窗口里面。
这时,如果基于CListView的类,声明变量,然后调用CListView类里的成员函数GetListCtrl()。
CListCtrl *pMyList;pMyList = &GetListCtrl();pMyList->ModifyStyle(0,LVS_ICON);//设置为视图类型三、其它设置。
如显示样式、位置、背景等。
设置显示样式:网格,选中时整行高亮pMyList->SetExtendedStyle( LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES );如要固定每列不能用鼠标拖动,添加如下代码:CHeaderCtrl* pHeaderCtrl = (CHeaderCtrl*)pMyList->GetHeaderCtrl();pHeaderCtrl->EnableWindow( FALSE ) ;四、之后可以插入行、列。
MFCCListCtrl控件使用总结整理一、基本操作:1. 创建CListCtrl实例,可以通过对话框资源添加控件或代码创建:```cppCListCtrl m_listCtrl;```2.设置列表样式,例如设置为报表样式:```cppm_listCtrl.Create(WS_VISIBLE , WS_CHILD , LVS_REPORT, CRect(10, 10, 500, 300), this, IDC_LIST_CTRL);```3.设置列表列头:```cppm_listCtrl.InsertColumn(0, _T("序号"), LVCFMT_LEFT, 50);m_listCtrl.InsertColumn(1, _T("姓名"), LVCFMT_LEFT, 100);m_listCtrl.InsertColumn(2, _T("年龄"), LVCFMT_LEFT, 50);```4.添加行数据:```cppint nItemIndex = m_listCtrl.InsertItem(0, _T("1"));m_listCtrl.SetItemText(nItemIndex, 1, _T("张三"));m_listCtrl.SetItemText(nItemIndex, 2, _T("20"));``````cppm_listCtrl.DeleteItem(nItemIndex); // 删除```二、高级操作:1.设置列宽:```cppm_listCtrl.SetColumnWidth(0, LVSCW_AUTOSIZE_USEHEADER);m_listCtrl.SetColumnWidth(1, LVSCW_AUTOSIZE);m_listCtrl.SetColumnWidth(2, LVSCW_AUTOSIZE);```2.设置行高:```cppm_listCtrl.SetItemHeight(0, 50);```3.设置行选中状态:```cppm_listCtrl.SetItemState(0, LVIS_SELECTED, LVIS_SELECTED);```4.设置行背景色:```cppm_listCtrl.SetItemState(0, LVIS_SELECTED , LVIS_FOCUSED, LVIS_SELECTED , LVIS_FOCUSED);m_listCtrl.SetSelectionMark(0);m_listCtrl.SetItemState(0, LVIS_SELECTED, LVIS_SELECTED);```5.设置行图标:```cppm_listCtrl.SetItemImage(nItemIndex, nImageIndex);```6.获取行数和列数:```cppint nItemCount = m_listCtrl.GetItemCount(;int nColumnCount = m_listCtrl.GetHeaderCtrl(->GetItemCount(;```7.获取行数据:```cppCString strItemText = m_listCtrl.GetItemText(nItemIndex, nSubItemIndex);```三、自定义操作:1.列排序:```cpp```2.行拖拽排序:```cppm_listCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT ,LVS_EX_GRIDLINES , LVS_EX_HEADERDRAGDROP);``````cppm_listCtrl.ModifyStyle(0, LVS_EDITLABELS);```4.行点击事件:```cppON_NOTIFY(NM_CLICK, IDC_LIST_CTRL, OnLButtonDown)```5.自定义绘制:```cppON_WM_DRAWITEM```四、注意事项和优化建议:1. 大量数据时,慎用SetRedraw方法来控制刷新。
CListCtrl使用详解CListCtrl使用详解2009年04月07日星期二 10:56 P.M.1。
先来介绍REPORT类型的CListCtrl:首先使用下面的语句设置CListCtrl的style:DWORD SetExtendedStyle( DWORD dwNewStyle );其中LVS_EX_CHECKBOXES 表示添加CheckBoxLVS_EX_FULLROWSELECT 表示选择整行LVS_EX_GRIDLINES 表示添加表格线如果设置了LVS_EX_CHECKBOXES属性,则可以用BOOL GetCheck( int nItem ) const;来得到某一行是否Checked。
可以先用下面的语句来删除以前的东西:for(int k=2;k>=0;k--) //注意要从后往前删,否则出错m_ListCtrl.DeleteColumn(k);m_ListCtrl.DeleteAllItems();用下面的语句新建列:m_ListCtrl.InsertColumn(0,_T("文件名"),LVCFMT_IMAGE|LVCFMT_LEFT);m_ListCtrl.InsertColumn(1,_T("仪器类别"));m_ListCtrl.InsertColumn(2,_T("项目类别"));其中LVCFMT_IMAGE表示可以在第一列加入图标。
如果不要图标可以删去。
然后设置列宽:for(j=0;j<3;j++)m_ListCtrl.SetColumnWidth(j ,100);以下为列表加入图标,如果不需要图标,可以跳过这一步。
注意只在第一次加入,如果多次加入会出错!先在头文件中加入声明:CImageList m_ImageList;这是必要的,如果在cpp的某个函数中加入由于生命期结束,CImageList自动释放,则效果是列表中看不到图标,只看到一个白方块。
MFC列表控件CListCtrl使⽤⽅法⽰范CListCtrl 获取选中的某⼀⾏POSITION ps = m_list.GetFirstSelectedItemPosition();int nSel = m_list.GetNextSelectedItem(ps);//选中的哪⾏的索引(based 0)// 或if(m_list.GetSelectedCount() <1)return;int nSel = m_list.GetSelectionMark();CListCtrl控件失去焦点时仍保持⾼亮1. 头⽂件中添加变量m_nSelItemint m_nSelItem;2. 为ListCtrl控件添加NM_KILLFOCUS(失去焦点)和NM_SETFOCUS(得到焦点)消息⼿动添加代码如下:头⽂件中添加声明afx_msg void OnNMKillfocusList(NMHDR *pNMHDR, LRESULT *pResult);afx_msg void OnNMSetfocusList(NMHDR *pNMHDR, LRESULT *pResult);源⽂件中添加映射ON_NOTIFY(NM_KILLFOCUS, IDC_LISTCTRL, OnNMKillfocusList)ON_NOTIFY(NM_SETFOCUS, IDC_LISTCTRL, OnNMSetfocusList)源⽂件中添加函数void CPageListView::OnNMKillfocusList(NMHDR *pNMHDR, LRESULT *pResult){// TODO: 在此添加控件通知处理程序代码m_nSelItem = m_ListCtrl.GetSelectionMark();m_ListCtrl.SetItemState(m_nSelItem, LVIS_DROPHILITED, LVIS_DROPHILITED);*pResult = 0;}void CPageListView::OnNMSetfocusList(NMHDR *pNMHDR, LRESULT *pResult){// TODO: 在此添加控件通知处理程序代码m_ListCtrl.SetItemState(m_nSelItem, FALSE, LVIF_STATE);*pResult = 0;}注意:Always Show Selection属性⼀定要设为FALSE以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
MFC总结之CListCtrl用法及技巧(二).续第一篇:MFC总结之CListCtrl用法及技巧(一)/zwgdft/article/details/7560592本篇重点介绍:禁止拖动表头、让第一列居中显示、设置行高与字体、虚拟列表技术、点击表头时进行归类、向上与向下移动、动态调整大小问题、避免闪烁问题。
6、禁止拖动表头重载OnNotify消息响应函数,屏蔽两个消息通知码:HDN_BEGINTRACKW 和HDN_DIVIDERDBLCLICKW。
示例如下:[cpp] view plaincopyprint?1.BOOL CXXXX::OnNotify(WPARAM wParam, LPARAM lPara m, LRESULT* pResult)2.{3.// TODO: Add your specialized code here and/or call the base class4.//屏蔽两个消息通知码,使得禁止拖动List表头5.NMHEADER* pNMHeader = (NMHEADER*)lParam;6.if(((pNMHeader->hdr.code == HDN_BEGINTRACKW) |7.(pNMHeader->hdr.code == HDN_DIVIDERDBLCLICKW)))8.{9.*pResult = TRUE;10.return TRUE;11.}12.13.return CDialog::OnNotify(wParam, lParam, pResult);14.}7、让第一列居中显示在插入列时,我们可以通过参数nFormat来设置文本居中显示,但是这种设置对于第一列是没有作用的。
这时我们可以考虑将我们的内容从第二列开始插入(设置为居中显示)。
先插入第一列,然后删除第一列,这样原先的第二列就充当了第一列。
8、设置行高和字体设置CListCtrl的行高没有函数接口,可以通过自绘来实现,但是比较麻烦。
list control控件用法
List 控件是Visual Basic中的一种新的控件,可以把项目以列表的
形式显示出来,可以把相同的项目放在一起,它的提供了四种形式的列表:普通列表框、树形列表框、多项选择列表框和选项卡列表框。
1、普通列表框:此列表框用于显示项目列表,可以在列表中单独选
择一项,或者按住Shift或Ctrl键实现多项选择:
2、树形列表框:此列表框可以用来显示树形结构的数据,可以在节
点展开并选择里面的某一项:
3、多项选择列表框:可以把列表框选择模式由普通模式切换成多项
选择模式,即允许用户在列表框中选择多个项目:
4、选项卡列表框:列表框也可以以选项卡为基础,使用此类列表框
可以在每一个选项卡上显示不同的项目,用户可以点击其中任意一个选项
卡来选择项目:
使用List控件,需要在程序中设置列表中的项目,即:通过使用AddItem 方法向列表控件中添加项目,可以把要列出的所有条目添加到
List控件中。
添加内容的方法也很简单:在List控件的内部把输入的字
符串按照“项目1,项目2”的形式添加进去即可。
CListCtrl控件常用操作:1、添加列标题头:InsertColumn2、获取与设置列宽:GetColumnWidth、SetColumnWidth3、添加一行:InsertItem、SetItemText4、获取与设置单元文本:GetItemText、SetItemText5、允许多行选中时,获取选中的行数:GetSelectedCount6、单行选中时,获取选中的行:GetSelectionMark7、选中某行:SetItemState(n, LVIS_SELECTED, LVIS_SELECTED);取消选中的行SetItemState(n,0,-1);使用此函数前需要先调用SetFocus();8、获取某行的状态是否为选中:GetItemState(n, LVIS_SELECTED) == LVIS_SELECTED9、删除所有行:DeleteAllItems10、删除指定列:DeleteColumn11、删除指定行:DeleteItem12、获取与设置列表控件的背景色:GetBkColor、SetBkColor13、获取与设置文字背景色:GetTextBkColor、SetTextBkColor14、获取与设置文字前景色:GetTextColor、SetTextColor15、获取与设置Check:GetCheck、SetCheck,使用前需要设置控件属性SetExtendedStyle(LVS_EX_CHECKBOXES);使控件有勾选功能16、获取与设置图标列表:GetImageList、SetImageList17、获取与设置行附加数据:GetItemData、SetItemData18、获取与设置扩展风格样式:GetExtendedStyle、SetExtendedStyle19、设置正行选中与网格线:SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);20、让ListCtrl支持编辑的功能:①、将属性中的 Edit Labels 设置为 True;②、响应控件的 LVN_EDNLABELEDIT 消息,添加如下代码:CString strText;m_ListCtrl.GetEditControl()->GetWindowText(strT ext);m_ListCtrl.SetItemT ext(pDispInfo->item.iItem,pDispInfo->item.iSubItem, strText);21、多行可选时,跳到第一个被选中的行,即使第一个被选中的行可视。
CListCtrl控件的使用
在系统中,经常会用到ListCtrl来对数据进行显示,那么在系统中,对ListCtrl的使用主要是两个函数进行使用。
结合主界面对ListCtrl的用法进行一下介绍:
第一步,从控件列表栏里面,拖动一个ListCtrl在主界面上:
第二步,修改ListCtrl的样式
第三步,修改ListCtrl的资源ID
第四步,为ListCtrl绑定一个变量。
右键点击ListCtrl控件,然后选择“建立类向导”,
按下图进行设置
第五步,添加设置ListCtrl表头的函数。
在类视图中右键点击“CAMSDlg”类,然后选择“”,弹出“添加成员函数”界面,输入函数类型及函数描述,选择可见域为“Private”,如下图所示,并点击“确定”
第六步,在InitListCtrlStyle函数中添加如下代码,设置ListCtrl的列头及样式:
第七步,添加ListCtrl的绑定数据的函数RefreshListCtrlData()。
在函数里面做如下操作,首先获取ListCtrl的记录行数n,然后在第n行依次往各列插入数据。
代码如下:
运行程序,界面图如下:。
mfc clistctrl 使用MFC(Microsoft Foundation Classes)是一套由Microsoft开发的C++类库,用于快速开发Windows应用程序。
CListCtrl是MFC中的一个常用控件,用于展示列表数据。
本文将介绍如何使用MFC的CListCtrl来展示和操作数据列表。
一、CListCtrl的基本使用在使用MFC的CListCtrl之前,需要先在Dlg中添加一个CListCtrl 控件。
可以通过拖拽的方式将其添加到Dlg,并设置好控件的相关属性(如ID、位置、大小等)。
在初始化过程中,需要对CListCtrl进行一些基本设置。
可以通过以下代码实现:```cpp// 声明一个指针指向CListCtrl对象CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST1);// 设置CListCtrl的风格pListCtrl->SetExtendedStyle(LVS_EX_FULLROWSELECT |LVS_EX_GRIDLINES);// 添加表头pListCtrl->InsertColumn(0, _T("列名称1"), LVCFMT_LEFT, 150);pListCtrl->InsertColumn(1, _T("列名称2"), LVCFMT_LEFT, 150);pListCtrl->InsertColumn(2, _T("列名称3"), LVCFMT_LEFT, 150);```通过上述代码,我们完成了CListCtrl的基本设置,包括设置风格、添加表头等。
二、添加数据接下来,我们需要向CListCtrl中添加数据。
可以通过以下代码实现:```cpp// 添加第一行数据pListCtrl->InsertItem(0, _T("数据1"));pListCtrl->SetItemText(0, 1, _T("数据2"));pListCtrl->SetItemText(0, 2, _T("数据3"));// 添加第二行数据pListCtrl->InsertItem(1, _T("数据4"));pListCtrl->SetItemText(1, 1, _T("数据5"));pListCtrl->SetItemText(1, 2, _T("数据6"));```通过上述代码,我们在CListCtrl中成功添加了两行数据。
1、/content/10/0118/20/722458_13940071.shtml先注明一下,这里,我们用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;LPNMITEMACTIVATE 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 == NULTRACE0("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}}条款十:删除条款九中选中的行这个相对前面九个条款是比较麻烦的,因为如果你要删除多行的话。
往往要出错比如,我现在要删除第0行和第1行(列表的行序列是从0开始的)那么好啊。
我来删了m_listctrl.DeleteItem(0)m_listctrl.DeleteItem(1)恭喜你,错了,我好开心啊:)因为你删除第0行以后,下面的行会往上移,那么原来的第1行就变成了第0行,那么你再 m_listctrl.DeleteItem(1),那么删除的是原来的第2行,真麻烦,所以,只有从下往上删,才是安全的,先删的,不会影响后面的操作,m_listctrl.DeleteItem(1)m_listctrl.DeleteItem(0)但有时候,我们也不知道要删除哪些行,只知道要删除选中的那些行,像条款九中的那些如果我们还是用POSITION pos = m_listctrl.GetFirstSelectedItemPosition();if (pos == NULL)TRACE0("No items were selected!\n");else{while (pos){int nItem = m_listctrl.GetNextSelectedItem(pos);m_listctrl.DeleteItem(nItem );}}你就等着收尸吧这时候我们就要B4微软了,为虾米木有GetLastselectedItemPosition 和GetPrevSelectedItem多写一对成员函数会死啊:(没办法,办法自己想,这里有个笨办法POSITION sSelPos = NULL;while(sSelPos = m_listctrl.GetFirstSelectedItemPosition()){int nSelItem = -1;nSelItem = m_listctrl.GetNextSelectedItem(sSelPos);if(nSelItem >= 0 && nSelItem<m_listctrl.GetItemCount()){好了,这个nSelItem 就是我们要的DD}}GetNextSelectedItem这个函数,看msdn的用法,其实是返回第一个的index,然后走到下一个选中的行去,所以这么做也是安全的,在实际中,俺也是这么做的,测试也通过,没问题的当然,还有个办法,先通过GetFirstSelectedItemPosition和GetNextSelectedItem来获取所有的选中行的index,然后把这些index放到一个数组里,然后再从下往上删唉真麻烦啊,还要不定数组,不说用new在堆上开吧,那么一个vector总是要的吧,麻烦啊所以我暂时是用上述的办法来删除,也供大家参考,希望能找到更好的办法。