VC中ListCtrl经验总结_第1页
VC中ListCtrl经验总结_第2页
VC中ListCtrl经验总结_第3页
VC中ListCtrl经验总结_第4页
VC中ListCtrl经验总结_第5页
全文预览已结束

下载本文档

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

文档简介

1、 VC中ListCtrl经验总结 ListCtrl在工作中,常常用到,也常常看到大家发帖问怎么用这个控件,故总结了一下自己的使用经验,以供参考使用。 先注明一下,这里,我们用m_listctrl来表示一个CListCtrl的类对象,然后这里我们的ListCtrl都是report形式,至于其他的如什么大图标,小图标的暂时不讲,毕竟report是大众话的使用。其次,我们这里用条款一,条款二来描述第一点,第二点,这个是参照Effective C+的叫法,俺觉得这么叫比较COOL :) 条款一:设置ListCtrl的风格 在CSDN上常常看到有人问怎么设置风格的,他们ListCtrl的样子是一个列表,

2、有横条和竖条分界线,然后选中一行,要整一行都选中,而不是只有某一列被选中,等等,这里给一个比较全面的设置方法。 /获得原有风格 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); /设置扩展风格

3、 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前面加个checkbox pListCtrl-SetExtendedStyle( m_listctrl.GetExtend

4、edStyle() | LVS_EX_SUBITEMIMAGES); 这也是一个很重要的属性,这样的话,可以在列表中加ICON,记得windows的任务管理器吗,你想做得那样,这个属性也要加哦,这个我以 后会讲的 条款二:加入列头 这是一个比较实质的东西,给列表框分列,然后加上列头,代码说话,来了 TCHAR rgtsz210 = _T(列头1), _T(列头2); LV_COLUMN lvcolumn; CRect rect; m_listctrl.GetWindowRect(&rect); for(int i=0;iiItem; 现在nItem就是点击选中那行的index了,有了index

5、,获取那行的信息还难吗 懒汉说:难,因为你还没讲,晕,那就继续说 条款七:根据行的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 用

6、来指明你想获取那些信息 具体可以查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的代码吧,反正很简单 / CListCtrl* p

7、ListCtrl = (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

8、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),那么删除的是原来的第行,真麻烦, 所以,只有从下往上删,才是安全的,先删的,不会

9、影响后面的操作, 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.DeleteI

10、tem(nItem ); 你就等着收尸吧 这时候我们就要B4微软了,为虾米木有GetLastselectedItemPosition 和GetPrevSelectedItem,多写一对成员函数会死啊:( 没办法,办法自己想,这里有个笨办法 POSITION sSelPos = NULL; while(sSelPos = m_listctrl.GetFirstSelectedItemPosition() int nSelItem = -1; nSelItem = m_listctrl.GetNextSelectedItem(sSelPos); if(nSelItem = 0 & nSelItem

11、=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;j3;j+) m_ListCtrl.Set

12、ColumnWidth(j ,100); 以下为列表加入图标,如果不需要图标,可以跳过这一步。注意只在第一次加入,如果多次加入会出错! 先在头文件中加入声明: CImageList m_ImageList; 这是必要的,如果在cpp的某个函数中加入由于生命期结束,CImageList自动释放,则效果是列表中看不到图标,只看到一个白方块。 下面生成CImageList,并将其绑定到CListCtrl中,这是CImageList中还没有图标,只是一个容器: static int flag=2; if(flag=2)/只调用一次SetImageList,否则出错 m_ImageList.Create

13、(128, 128, ILC_COLORDDB|ILC_MASK, 20, 1); m_ListCtrl.SetImageList(&m_ImageList,LVSIL_SMALL); flag=(flag+1)%2; 如果CListCtrl已经用过,曾经加过图标进去,这时就要删除上次放进m_ImageList中的Image for(int kk=0;kkm_ImageList.GetImageCount();kk+) m_ImageList.Remove(k); 下面介绍如何向CListCtrl里面加入行,并同时为每一行动态加入图标: 假设m_listRowCount为要加入的行数。 CBi

14、tmap* bitmap; bitmap=new CBitmapm_list1rowCount; HBITMAP hbitmap; for(int i = 0; i m_listRowCount; i+) /为每一行插入相应的缩略图 CFile f; CFileException e; if( !f.Open(m_FileName, CFile:modeRead, &e ) /m_FileName为bmp文件名,由你来定 hbitmap = (HBITMAP)LoadImage(NULL,path+blank.bmp,IMAGE_BITMAP,0,0, LR_CREATEDIBSECTION|

15、LR_DEFAULTSIZE|LR_LOADFROMFILE); else f.Close(); hbitmap = (HBITMAP)LoadImage(NULL,bmpFile,IMAGE_BITMAP,0,0, LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE); bitmapi.Attach(hbitmap); m_ImageList.Add(&bitmapi, RGB(0, 128, 128); /插入行 m_ListCtrl.InsertItem(i,m_FileName,i); m_ListCtrl.SetItemText(i,

16、1,type); m_ListCtrl.SetItemText(i,2,m_Path); /记得删除已经没用的临时文件 if(m_list1rowCount!=0) delete bitmap; 2。如果是ICON类型的CListCtrl,则要做一点点改动: 把绑定图标集的代码由 SetImageList(&m_ImageList,LVSIL_SMALL); 改为 SetImageList(&m_ImageList,LVSIL_NORMAL); 插入行时只用 InsertItem(i,mainSet.m_FileName,i); 不用 SetItemText(i,1,type); 之类的代码。

17、 3.如何 让ListCtrl的CheckBox只有一个处于选中状态 1、 要让ListCtrl的每一行的第一列为CheckBox,需要做如下设置: listCtrl.SetExtendedStyle(m_listCtrl.GetExtendedStyle()|LVS_EX_CHECKBOXES); 2、 为了限制ListCtrl只能有一行的CheckBox处于选中状态,则需要: 响应ListCtrl的 LVN_ITEMCHANGED 消息: 例如: ON_NOTIFY(LVN_ITEMCHANGED, IDC_LC_CONFIG, OnLvnItemchangedLcConfig) void CRestorePage:OnLvnItemchangedLcConfig(NMHDR *pNMHDR, LRESULT *pResult) LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR); / TODO: 在此添加控件通知处理程序代码 if(m_

温馨提示

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

评论

0/150

提交评论