CListCtrl使用技巧大全.docx
- 文档编号:7930147
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:13
- 大小:21.83KB
CListCtrl使用技巧大全.docx
《CListCtrl使用技巧大全.docx》由会员分享,可在线阅读,更多相关《CListCtrl使用技巧大全.docx(13页珍藏版)》请在冰豆网上搜索。
CListCtrl使用技巧大全
CListCtrl使用技巧
1.CListCtrl风格2
2.设置listctrl风格及扩展风格2
3.插入数据3
4.一直选中item3
5.选中和取消选中一行3
6.得到listctrl中所有行的checkbox的状态3
7.得到listctrl中所有选中行的序号4
8.得到item的信息4
9.得到listctrl的所有列的header字符串内容5
10.使listctrl中一项可见,即滚动滚动条5
11.得到listctrl列数6
12.删除所有列6
13.得到单击的listctrl的行列号6
14.判断是否点击在listctrl的checkbox上7
15.右键点击listctrl的item弹出菜单8
16.item切换焦点时(包括用键盘和鼠标切换item时),状态的一些变化顺序8
17.得到另一个进程里的listctrl控件的item内容9
18.选中listview中的item10
19.如何在CListView中使用CListCtrl的派生类10
20.listctrl的subitem添加图标10
21.在CListCtrl显示文件,并根据文件类型来显示图标10
22.listctrl内容进行大数据量更新时,避免闪烁13
23.listctrl排序13
24.在listctrl中选中某个item时动态改变其icon或bitmap14
25.在添加item后,再InsertColumn()后导致整列数据移动的问题14
26.关于listctrl第一列始终居左的问题14
27.锁定columnheader的拖动14
28.如何隐藏clistctrl的列15
29.listctrl进行大数据量操作时,使用virtuallist15
30.关于item只能显示259个字符的问题15
31.响应在listctrl的columnheader上的鼠标右键单击15
32.类似于windows资源管理器的listview16
33.在ListCtrl中OnTimer只响应两次的问题16
34.以下为一些为实现各种自定义功能的listctrl派生类16
以下未经说明,listctrl默认view风格为report
1.CListCtrl风格
LVS_ICON:
为每个item显示大图标
LVS_SMALLICON:
为每个item显示小图标
LVS_LIST:
显示一列带有小图标的item
LVS_REPORT:
显示item详细资料
直观的理解:
windows资源管理器,“查看”标签下的“大图标,小图标,列表,详细资料”
2.设置listctrl风格及扩展风格
LONGlStyle;
lStyle=GetWindowLong(m_list.m_hWnd,GWL_STYLE);//获取当前窗口style
lStyle&=~LVS_TYPEMASK;//清除显示方式位
lStyle|=LVS_REPORT;//设置style
SetWindowLong(m_list.m_hWnd,GWL_STYLE,lStyle);//设置style
DWORDdwStyle=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
3.插入数据
m_list.InsertColumn(0,"ID",LVCFMT_LEFT,40);//插入列
m_list.InsertColumn(1,"NAME",LVCFMT_LEFT,50);
intnRow=m_list.InsertItem(0,“11”);//插入行
m_list.SetItemText(nRow,1,“jacky”);//设置数据
4.一直选中item
选中style中的Showselectionalways,或者在上面第2点中设置LVS_SHOWSELALWAYS
5.选中和取消选中一行
intnIndex=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);
CStringstr;
for(inti=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中所有选中行的序号 方法一: CStringstr; for(inti=0;i { if(m_list.GetItemState(i,LVIS_SELECTED)==LVIS_SELECTED) { str.Format(_T("选中了第%d行"),i); AfxMessageBox(str); } } 方法二: POSITIONpos=m_list.GetFirstSelectedItemPosition(); if(pos==NULL) TRACE0("Noitemswereselected! \n"); else { while(pos) { intnItem=m_list.GetNextSelectedItem(pos); TRACE1("Item%dwasselected! \n",nItem); //youcoulddoyourownprocessingonnItemhere } } 8.得到item的信息 TCHARszBuf[1024]; LVITEMlvi; lvi.iItem=nItemIndex; lvi.iSubItem=0; lvi.mask=LVIF_TEXT; lvi.pszText=szBuf; lvi.cchTextMax=1024; m_list.GetItem(&lvi); 关于得到设置item的状态,还可以参考msdn文章 Q173242: UseMaskstoSet/GetItemStatesinCListCtrl 9.得到listctrl的所有列的header字符串内容 LVCOLUMNlvcol; char str[256]; int nColNum; CString strColumnName[4];//假如有4列 nColNum=0; lvcol.mask=LVCF_TEXT; lvcol.pszText=str; lvcol.cchTextMax=256; while(m_list.GetColumn(nColNum,&lvcol)) { strColumnName[nColNum]=lvcol.pszText; nColNum++; } 10.使listctrl中一项可见,即滚动滚动条 m_list.EnsureVisible(i,FALSE); 11.得到listctrl列数 intnHeadNum=m_list.GetHeaderCtrl()->GetItemCount(); 12.删除所有列 方法一: while(m_list.DeleteColumn(0)) 因为你删除了第一列后,后面的列会依次向上移动。 方法二: intnColumns=4; for(inti=nColumns-1;i>=0;i–) m_list.DeleteColumn(i); 13.得到单击的listctrl的行列号 添加listctrl控件的NM_CLICK消息相应函数 voidCTest6Dlg: : OnClickList1(NMHDR*pNMHDR,LRESULT*pResult) { //方法一: /* DWORDdwPos=GetMessagePos(); CPointpoint(LOWORD(dwPos),HIWORD(dwPos)); m_list.ScreenToClient(&point); LVHITTESTINFOlvinfo; lvinfo.pt=point; lvinfo.flags=LVHT_ABOVE; intnItem=m_list.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.判断是否点击在listctrl的checkbox上 添加listctrl控件的NM_CLICK消息相应函数 voidCTest6Dlg: : OnClickList1(NMHDR*pNMHDR,LRESULT*pResult) { DWORDdwPos=GetMessagePos(); CPointpoint(LOWORD(dwPos),HIWORD(dwPos)); m_list.ScreenToClient(&point); LVHITTESTINFOlvinfo; lvinfo.pt=point; lvinfo.flags=LVHT_ABOVE; UINTnFlag; intnItem=m_list.HitTest(point,&nFlag); //判断是否点在checkbox上 if(nFlag==LVHT_ONITEMSTATEICON) { AfxMessageBox("点在listctrl的checkbox上"); } *pResult=0; } 15.右键点击listctrl的item弹出菜单 添加listctrl控件的NM_RCLICK消息相应函数 voidCTest6Dlg: : 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.item切换焦点时(包括用键盘和鼠标切换item时),状态的一些变化顺序 添加listctrl控件的LVN_ITEMCHANGED消息相应函数 voidCTest6Dlg: : OnItemchangedList1(NMHDR*pNMHDR,LRESULT*pResult) { NM_LISTVIEW*pNMListView=(NM_LISTVIEW*)pNMHDR; //TODO: Addyourcontrolnotificationhandlercodehere CStringsTemp; if((pNMListView->uOldState&LVIS_FOCUSED)==LVIS_FOCUSED&& (pNMListView->uNewState&LVIS_FOCUSED)==0) { sTemp.Format("%dlostedfocus",pNMListView->iItem); } elseif((pNMListView->uOldState&LVIS_FOCUSED)==0&& (pNMListView->uNewState&LVIS_FOCUSED)==LVIS_FOCUSED) { sTemp.Format("%dgotfocus",pNMListView->iItem); } if((pNMListView->uOldState&LVIS_SELECTED)==LVIS_SELECTED&& (pNMListView->uNewState&LVIS_SELECTED)==0) { sTemp.Format("%dlostedselected",pNMListView->iItem); } elseif((pNMListView->uOldState&LVIS_SELECTED)==0&& (pNMListView->uNewState&LVIS_SELECTED)==LVIS_SELECTED) { sTemp.Format("%dgotselected",pNMListView->iItem); } *pResult=0; } 17.得到另一个进程里的listctrl控件的item内容 18.选中listview中的item Q131284: HowToSelectaListviewItemProgrammatically 19.如何在CListView中使用CListCtrl的派生类 20.listctrl的subitem添加图标 m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES); m_list.SetItem(..);//具体参数请参考msdn 21.在CListCtrl显示文件,并根据文件类型来显示图标 网上找到的代码,share BOOLCTest6Dlg: : OnInitDialog() { CDialog: : OnInitDialog(); HIMAGELISThimlSmall; HIMAGELISThimlLarge; SHFILEINFOsfi; char cSysDir[MAX_PATH]; CString 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_LARGE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CListCtrl 使用 技巧 大全