ListCtrl控件使用技巧.docx
- 文档编号:11893179
- 上传时间:2023-04-08
- 格式:DOCX
- 页数:15
- 大小:21KB
ListCtrl控件使用技巧.docx
《ListCtrl控件使用技巧.docx》由会员分享,可在线阅读,更多相关《ListCtrl控件使用技巧.docx(15页珍藏版)》请在冰豆网上搜索。
ListCtrl控件使用技巧
1.CListCtrl样式及设置
2.扩展样式设置
3.数据插入
4.一直选中Item
5.选中和取消选中Item
6.得到CListCtrl中所有行的checkbox的状态
7.得到CListCtrl中所有选中行的序号
8.得到item的信息
9.得到CListCtrl的所有列的header字符串内容
10.使CListCtrl中一项可见,即滚动滚动条
11.得到CListCtrl列数
12.删除所有列
13.得到单击的CListCtrl的行列号
14.判断是否点击在CListCtrl的checkbox上
15.右键点击CListCtrl的item弹出菜单
16.CListCtrl进行大数据量更新时,避免闪烁
!
时间仓促,此播客内容大多为网上整理,特向原作者表示感谢!
--------------------------------------------------------------------------------
1.CListCtrl样式及设置
LVS_ICON:
每个item显示大图标
LVS_SMALLICON:
每个item显示小图标
LVS_LIST:
显示一列带有小图标的item
LVS_REPORT:
显示item详细资料
如windows资源管理器,“查看”标签下的“大图标,小图标,列表,详细资料”
LONGlStyle;
lStyle=GetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE);//获取当前窗口style
lStyle&=~LVS_TYPEMASK;//清除显示方式位
lStyle|=LVS_REPORT;//设置style
SetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE,lStyle);//设置style
--------------------------------------------------------------------------------
2.扩展样式设置
DWORDdwStyle=m_ListCtrl.GetExtendedStyle();//获取当前扩展样式
dwStyle|=LVS_EX_FULLROWSELECT;//选中某行使整行高亮(report风格时)
dwStyle|=LVS_EX_GRIDLINES;//网格线(report风格时)
dwStyle|=LVS_EX_CHECKBOXES;//item前生成checkbox控件
m_ListCtrl.SetExtendedStyle(dwStyle);//设置扩展风格
--------------------------------------------------------------------------------
3.数据插入
m_ListCtrl.InsertColumn(0,"名称",LVCFMT_LEFT,50);//插入列
m_ListCtrl.InsertColumn(1,"备注",LVCFMT_LEFT,50);
//直接插入:
intnRow=m_ListCtrl.InsertItem(0,"VC++"); //插入行
m_ListCtrl.SetItemText(nRow,1,"VisualC++6.0");//设置数据
//LVITEM结构插入:
LVITEMitem={0};
item.iItem=0;//行号
item.mask=LVIF_TEXT;/*LVIF_IMAGE支持图标*/;
item.cchTextMax=15;//插入字符串长度
item.pszText="VisualC++6.0";
intnRow=m_ListCtrl.InsertItem(&item);
m_ListCtrl.SetItemText(nRow,1,"VisualC++6.0");
--------------------------------------------------------------------------------
4.一直选中Item
选中style中的Showselectionalways,
或者添加扩展样式LVS_SHOWSELALWAYS
--------------------------------------------------------------------------------
5.选中和取消选中Item
intnIndex=0;
//选中
m_ListCtrl.SetItemState(nIndex,LVIS_SELECTED|
LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED);
//取消选中
m_ListCtrl.SetItemState(nIndex,0,LVIS_SELECTED|LVIS_FOCUSED);
--------------------------------------------------------------------------------
6.得到CListCtrl中所有行的checkbox的状态
CStringstr;
for(inti=0;i { if(m_ListCtrl.GetItemState(i,LVIS_SELECTED)== LVIS_SELECTED||m_ListCtrl.GetCheck(i)) { str.Format(_T("第%d行的checkbox为选中状态"),i); AfxMessageBox(str); } } -------------------------------------------------------------------------------- 7.得到CListCtrl中所有选中行的序号 //方法一: CStringstr; for(inti=0;i { if(m_ListCtrl.GetItemState(i,LVIS_SELECTED)==LVIS_SELECTED) { str.Format(_T("选中了第%d行"),i); AfxMessageBox(str); } } //方法二: POSITIONpos=m_ListCtrl.GetFirstSelectedItemPosition(); if(pos==NULL) TRACE0("Noitemswereselected! \n"); else { while(pos) { intnItem=m_ListCtrl.GetNextSelectedItem(pos); TRACE1("Item%dwasselected! \n",nItem); //添加其他操作 } } -------------------------------------------------------------------------------- 8.得到item的信息 TCHARszBuf[1024]; LVITEMlvi; lvi.iItem=nItemIndex; lvi.iSubItem=0; lvi.mask=LVIF_TEXT; lvi.pszText=szBuf; lvi.cchTextMax=1024; m_ListCtrl.GetItem(&lvi); 关于得到设置item的状态,还可以参考msdn文章 Q173242: UseMaskstoSet/GetItemStatesinCListCtrl -------------------------------------------------------------------------------- 9.得到CListCtrl的所有列的header字符串内容 LVCOLUMNlvcol; charstr[256]; int nColNum; CStringstrColumnName[3];//假如有3列 nColNum=0; lvcol.mask=LVCF_TEXT; lvcol.pszText=str; lvcol.cchTextMax=256; while(m_list.GetColumn(nColNum,&lvcol)) { strColumnName[nColNum]=lvcol.pszText; nColNum++; } -------------------------------------------------------------------------------- 10.使CListCtrl中一项可见,即滚动滚动条 m_ListCtrl.EnsureVisible(i,FALSE); -------------------------------------------------------------------------------- 11.得到CListCtrl列数 intnHeadNum=m_ListCtrl.GetHeaderCtrl()->GetItemCount(); -------------------------------------------------------------------------------- 12.删除所有列 方法一: while(m_ListCtrl.DeleteColumn(0)) //因为你删除了第一列后,后面的列会依次向上移动。 方法二: intnColumns=3;//列数 for(inti=nColumns-1;i>=0;i--) m_ListCtrl.DeleteColumn(i); -------------------------------------------------------------------------------- 13.得到单击的CListCtrl的行列号 添加listctrl控件的NM_CLICK消息相应函数 voidCMyDlg: : OnClickList1(NMHDR*pNMHDR,LRESULT*pResult) { //方法一: DWORDdwPos=GetMessagePos(); CPointpoint(LOWORD(dwPos),HIWORD(dwPos)); m_ListCtrl.ScreenToClient(&point); LVHITTESTINFOlvinfo; lvinfo.pt=point; lvinfo.flags=LVHT_ABOVE; intnItem=m_ListCtrl.SubItemHitTest(&lvinfo); if(nItem! =-1) { CStringstrtemp; strtemp.Format("单击的是第%d行第%d列", lvinfo.iItem,lvinfo.iSubItem); AfxMessageBox(strtemp); } //方法二: NM_LISTVIEW*pNMListView=(NM_LISTVIEW*)pNMHDR; if(pNMListView->iItem! =-1) { CStringstrtemp; strtemp.Format("单击的是第%d行第%d列", pNMListView->iItem,pNMListView->iSubItem); AfxMessageBox(strtemp); } *pResult=0; } -------------------------------------------------------------------------------- 14.判断是否点击在CListCtrl的checkbox上 添加listctrl控件的NM_CLICK消息相应函数 voidCMyDlg: : OnClickList1(NMHDR*pNMHDR,LRESULT*pResult) { DWORDdwPos=GetMessagePos(); CPointpoint(LOWORD(dwPos),HIWORD(dwPos)); m_ListCtrl.ScreenToClient(&point); LVHITTESTINFOlvinfo; lvinfo.pt=point; lvinfo.flags=LVHT_ABOVE; UINTnFlag; intnItem=m_ListCtrl.HitTest(point,&nFlag); //判断是否点在checkbox上 if(nFlag==LVHT_ONITEMSTATEICON) { AfxMessageBox("点在listctrl的checkbox上"); } *pResult=0; } -------------------------------------------------------------------------------- 15.右键点击CListCtrl的item弹出菜单 添加CListCtrl控件的NM_RCLICK消息相应函数 voidCMyDlg: : OnRclickList1(NMHDR*pNMHDR,LRESULT*pResult) { NM_LISTVIEW*pNMListView=(NM_LISTVIEW*)pNMHDR; if(pNMListView->iItem! =-1) { DWORDdwPos=GetMessagePos(); CPointpoint(LOWORD(dwPos),HIWORD(dwPos)); CMenumenu; 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.CListCtrl进行大数据量更新时,避免闪烁 m_ListCtrl.SetRedraw(FALSE); //更新内容 m_ListCtrl.SetRedraw(TRUE); m_ListCtrl.Invalidate(); m_ListCtrl.UpdateWindow(); //或者参考 /////////////////////////////////////////////////******************************************************************************************************************************** CListCtrl控件主要事件及LVN_ITEMCHANGED消息和鼠标双击列表项事件的处理 2009年08月03日星期一下午04: 18 LVN_BEGINDRAG鼠标左键正在被触发以便进行拖放操作(当鼠标左键开始拖拽列表视图控件中的项目时产生) LVN_BEGINRDRAG鼠标右键正在被触发以便进行拖放操作(当鼠标右键开始拖拽列表视图控件中的项目时产生) LVN_BEGINLABELEDIT开始编辑项的文本 LVN_COLUMNCLICK单击列(当鼠标单击列表视图控件列标题时产生) NM_CLICK当鼠标单击列表视图控件时产生 LVN_COLUMNCLICK单击列 LVN_DELETEALLITEMS删除所有项 LVN_DELETEITEM删除某个项 NM_DBLCLK当鼠标双击列表视图控件时产生 LVN_ENDLABELEDIT结束对项文本的编辑 LVN_GETDISPINFO请求需要显示的信息 LVN_GETINFOTIP请求显示在工具提示窗口内的附加的文本信息 LVN_HOTTRACK鼠标滑过某个项 LVN_INSERTITEM当向列表视图控件插入项目时产生 lVN_ITEMACTIVATE激活某个项 LVN_ITEMCHANGED某个项已经发生变化 LVN_ITEMCHANGING某个项目正在发生变化 NM_KILLFOCUS当视表列图控件失去焦点时产生 LVN_KEYDOWN某个键被按下 LVN_MARQUEEBEGIN开始某个边框选择 NM_OUTOFMEMORY当内存溢出时产生 LVN_ODCACHEHINT虚拟列表控件的显示区域的内容发生了变化 LVN_ODSTATECHANGED虚拟列表的控件的某个项或某个范围内的项已经发生变化 LVN_ODFINDITEM需要拥有者查找一个特定的回调项 NM_RCLICK当鼠标右键单击列表视图控件时产生 NM_RDBLCLK当鼠标右键双击列表视图控件时产生 NM_SETFOCUS当列表视图控件获得焦点时产生 LVN_SETDISPINFO父窗口必须更新控件为项所维护的信息 注解: HDN: HeaderNotify LVN: ListViewcontrolNotify NM: NotifyMessage TVN: TreeViewcontrolNotify LVN_ITEMCHANGED消息的处理 消息处理函数: voidC***Dlg: : OnItemchangedList(NMHDR*pNMHDR,LRESULT*pResult) { NM_LISTVIEW*pNMListView=(NM_LISTVIEW*)pNMHDR; if(pNMListView->uChanged==LVIF_STATE) { if(pNMListView->uNewState&LVIS_SELECTED) { //处理内容 intnItem=pNMListView->iItem; CStringvalue[6]; for(inti=0;i<6;i++) { value[i]=m_List.GetItemText(nItem,i); } } } *pResult=0; } 消息处理函数中的两个if条件句一定要有,否则可能出现多次进入处理内容的问题。 鼠标双击列表项事件的处理 响应NM_DBLCLK消息: voidCDisSalaryDlg: : OnDblclkList(NMHDR*pNMHDR,LRESULT*pResult) { NM_LISTVIEW*pNMListView=(NM_LISTVIEW*)pNMHDR; intnItem=pNMListView->iItem; if(nItem>=0&&nItem { ............. } *pResult=0; } 消息处理函数中的if语句很重要,用于判断双击位置是否在有数据的列表项上面。 因为NM_DBLCLK消息是CListCtrl控件(整体)消息,只要是在CListCtrl控件范围之内执行此事件就会产生该消息,而不一定要在有数据的列表项上面。 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 防止CListCtrl闪烁的几种方法 (2009-12-2811: 24: 15) 转载 标签: listctrl 闪烁 防止 it 分类: VC及相关 1.使用SetRedraw禁止窗口重绘,操作完成后,再恢复窗口重绘 m_ctlList.SetRedraw(FALSE); //以下为更新数据操作 //…… //恢复窗口重绘 m_ctlList.SetRedraw(TRUE); 2.使用LockWindowUpdate禁止窗口重绘,操作完成后,用UnlockWindowUpdate恢复窗口重绘 m_ctlList.LockWindowUpdate(); //以下为更新数据操作 //…… //恢复窗口重绘 m_ctlList.UnlockWindowUpdate(); 3.使用ListCtrl的内部双缓冲 m_ctlLisit.SetExtendedStyle(m_ctlLisit.GetExtendedStyle()|LVS_EX_DOUBLEBUFFER); VC6未定义LVS_EX_DOUBLEBUFFER宏,使用者可以自定义,如下: #defineLVS_EX_DOUBLEBUFFER 0x00010000 4.VirtualList 首先要设置ListCtrl风格为LVS_REPORT|LVS_OWNERDATA或在ListCtrl属里中的MoreStyles页面中选中Ownerdata复选框。 其次要向应LVN_GETDISPINFO消息; voidOnGetdispinfoList(NMHDR*pNMHDR,LRESULT*pResult) { LV_DISPINFO*pDispInfo=(LV_DISPINFO*)pNMHDR; LV_ITEM*pItem=&(pDispInfo)->i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ListCtrl 控件 使用 技巧