ListCtrl控件的风格设置.docx
《ListCtrl控件的风格设置.docx》由会员分享,可在线阅读,更多相关《ListCtrl控件的风格设置.docx(21页珍藏版)》请在冰豆网上搜索。
ListCtrl控件的风格设置
1.ListCtrl风格
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);//设置扩展风格
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);}}CStringstrIns;strIns="deletefromtmpStatByGround";m_pRs.CreateInstance(__uuidof(Recordset));m_pRs->CursorLocation=adUseClient;m_pRs->Open((LPCTSTR)strIns,vDispatch,adOpenKeyset,adLockOptimistic,adCmdUnknown);--------------------------------------------------------------------------------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);--------------------------------------------------------------------------------9.得到listctrl的所有列的header字符串内容LVCOLUMNlvcol;charstr[256];intnColNum;CStringstrColumnName[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:AddyourcontrolnotificationhandlercodehereCStringsTemp;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的subitem添加图标注意:首先要用InsertItem()插入一行的第一列,然后才能用SetItem设置其他项m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES);m_userlist.SetItem(..);--------------------------------------------------------------------------------18.在CListCtrl显示文件,并根据文件类型来显示图标网上找到的代码,自己试用并改正过,share步骤1:设置list的图像列表为系统图像列表BOOLSetSystemImageList(CListCtrl&list){HIMAGELISThimlSmall;HIMAGELISThimlLarge;SHFILEINFOsfi;charcSysDir[MAX_PATH];CStringstrBuf;memset(cSysDir,0,MAX_PATH);GetWindowsDirectory(cSysDir,MAX_PATH);strBuf=cSysDir;//SHGetFileInfo://IfuFlagscontainsSHGFI_SYSICONINDEX,thereturnvalueisahandleto//animagelistthatcontainsthelargeiconimages.//IfSHGFI_SMALLICONisincludedwithSHGFI_SYSICONINDEX,thereturnvalue//isthehandletoanimagelistthatcontainsthesmalliconimages.//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(list.m_hWnd,LVM_SETIMAGELIST,(WPARAM)LVSIL_SMALL,(LPARAM)himlSmall);::SendMessage(list.m_hWnd,LVM_SETIMAGELIST,(WPARAM)LVSIL_NORMAL,(LPARAM)himlLarge);}returnTRUE;}步骤2:给列表添加指定的文件,同时获得该文件的的图标索引,给list添加图标intGetIconIndex(LPCTSTRlpszPath,BOOLbIsDir,BOOLbSelected);//向前声明voidAddFiles(CListCtrl&list,LPCTSTRlpszFileName,BOOLbAddToDocument){intnIcon=GetIconIndex(lpszFileName,FALSE,TRUE);CStringstrSize;CFileFindfilefind;//getfilesizeif(filefind.FindFile(lpszFileName)){filefind.FindNextFile();strSize.Format("%d",filefind.GetLength());}elsestrSize="0";//splitpathandfilenameCStringstrFileName=lpszFileName;CStringstrPath;intnPos=strFileName.ReverseFind('\\');if(nPos!=-1){strPath=strFileName.Left(nPos);strFileName=strFileName.Mid(nPos1);}//inserttolistintnItem=list.GetItemCount();//list.InsertItem(nItem,strFileName,nIcon);//list.SetItemText(nItem,1,strSize);////此处可以根据实际需要修改代码//}--------------------------------------------------------------------------------19.listctrl内容进行大数据量更新时,避免闪烁m_list.SetRedraw(FALSE);//更新内容m_list.SetRedraw(TRUE);m_list.Invalidate();m_list.UpdateWindow();20.清除ListCtrl以重新初始化://删除所有行m_ctrllist.DeleteAllItems();//删除所有列intiColCount=m_ctrllist.GetHeaderCtrl()->GetItemCount();//方法1//原理:删除第一列后,其他列向前移动while(m_ctrllist.DeleteColumn(0));//方法2for(inti=0;i{m_ctrllist.DeleteColumn(0);}
{
if(m_list.GetItemState(i,LVIS_SELECTED)==LVIS_SELECTED||m_list.GetCheck(i))
str.Format(_T("第%d行的checkbox为选中状态"),i);
AfxMessageBox(str);
}
CStringstrIns;
strIns="deletefromtmpStatByGround";
m_pRs.CreateInstance(__uuidof(Recordset));
m_pRs->CursorLocation=adUseClient;
m_pRs->Open((LPCTSTR)strIns,vDispatch,adOpenKeyset,
adLockOptimistic,adCmdUnknown);
7.得到listctrl中所有选中行的序号
方法一:
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);--------------------------------------------------------------------------------9.得到listctrl的所有列的header字符串内容LVCOLUMNlvcol;charstr[256];intnColNum;CStringstrColumnName[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:AddyourcontrolnotificationhandlercodehereCStringsTemp;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的subitem添加图标注意:首先要用InsertItem()插入一行的第一列,然后才能用SetItem设置其他项m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES);m_userlist.SetItem(..);--------------------------------------------------------------------------------18.在CListCtrl显示文件,并根据文件类型来显示图标网上找到的代码,自己试用并改正过,share步骤1:设置list的图像列表为系统图像列表BOOLSetSystemImageList(CListCtrl&list){HIMAGELISThimlSmall;HIMAGELISThimlLarge;SHFILEINFOsfi;charcSysDir[MAX_PATH];CStringstrBuf;memset(cSysDir,0,MAX_PATH);GetWindowsDirectory(cSysDir,MAX_PATH);strBuf=cSysDir;//SHGetFileInfo://IfuFlagscontainsSHGFI_SYSICONINDEX,thereturnvalueisahandleto//animagelistthatcontainsthelargeiconimages.//IfSHGFI_SMALLICONisincludedwithSHGFI_SYSICONINDEX,thereturnvalue//isthehandletoanimagelistthatcontainsthesmalliconimages.//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(list.m_hWnd,LVM_SETIMAGELIST,(WPARAM)LVSIL_SMALL,(LPARAM)himlSmall);::SendMessage(list.m_hWnd,LVM_SETIMAGELIST,(WPARAM)LVSIL_NORMAL,(LPARAM)himlLarge);}returnTRUE;}步骤2:给列表添加指定的文件,同时获得该文件的的图标索引,给list添加图标intGetIconIndex(LPCTSTRlpszPath,BOOLbIsDir,BOOLbSelected);//向前声明voidAddFiles(CListCtrl&list,LPCTSTRlpszFileName,BOOLbAddToDocument){intnIcon=GetIconIndex(lpszFileName,FALSE,TRUE);CStringstrSize;CFileFindfilefind;//getfilesizeif(filefind.FindFile(lpszFileName)){filefind.FindNextFile();strSize.Format("%d",filefind.GetLength());}elsestrSize="0";//splitpathandfilenameCStringstrFileName=lpszFileName;CStringstrPath;intnPos=strFileName.ReverseFind('\\');if(nPos!=-1){strPath=strFileName.Left(nPos);strFileName=strFileName.Mid(nPos1);}//inserttolistintnItem=list.GetItemCount();//list.InsertItem(nItem,strFileName,nIcon);//list.SetItemText(nItem,1,strSize);////此处可以根据实际需要修改代码//}--------------------------------------------------------------------------------19.listctrl内容进行大数据量更新时,避免闪烁m_list.SetRedraw(FALSE);//更新内容m_list.SetRedraw(TRUE);m_list.Invalidate();m_list.UpdateWindow();20.清除ListCtrl以重新初始化://删除所有行m_ctrllist.DeleteAllItems();//删除所有列intiColCount=m_ctrllist.GetHeaderCtrl()->GetItemCount();//方法1//原理:删除第一列后,其他列向前移动while(m_ctrllist.DeleteColumn(0));//方法2for(inti=0;i{m_ctrllist.DeleteColumn(0);}
if(m_list.GetItemState(i,LVIS_SELECTED)==LVIS_SELECTED)
str.Format(_T("选中了第%d行"),i);
方法二:
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);
9.得到listctrl的所有列的header字符串内容
LVCOLUMNlvcol;
charstr[256];
intnColNum;
CStringstrColumnName[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!
strtemp.Format("单击的是第%d行第%d列",
pNMListView->iItem,pNMListView->iSubItem);
*pResult=0;
14.判断是否点击在listctrl的checkbox上
UINTnFlag;
intnItem=m_list.HitTest(point,&nFlag);
//判断是否点在checkbox上
if(nFlag==LVHT_ONITEMSTATEICON)
AfxMessageBox("点在listctrl的checkbox上");
15.右键点击listctrl的item弹出菜单
添加listctrl控件的NM_RCLICK消息相应函数
OnRclickList1(NMHDR*pNMHDR,LRESULT*pResult)
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);
16.item切换焦点时(包括用键盘和鼠标切换item时),状态的一些变化顺序
添加listctrl控件的LVN_ITEMCHANGED消息相应函数
OnItemchangedList1(NMHDR*pNMHDR,LRESULT*pResult)
//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);
17.listctrl的subitem添加图标
注意:
首先要用InsertItem()插入一行的第一列,然后才能用SetItem设置其他项
m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES);
m_userlist.SetItem(..);
18.在CListCtrl显示文件,并根据文件类型来显示图标
网上找到的代码,自己试用并改正过,share
步骤1:
设置list的图像列表为系统图像列表
BOOLSetSystemImageList(CListCtrl&list)
HIMAGELISThimlSmall;
HIMAGELISThimlLarge;
SHFILEINFOsfi;
charcSysDir[MAX_PATH];
CStringstrBuf;
memset(cSysDir,0,MAX_PATH);
GetWindowsDirectory(cSysDir,MAX_PATH);
strBuf=cSysDir;
//SHGetFileInfo:
//IfuFlagscontainsSHGFI_SYSICONINDEX,thereturnvalueisahandleto
//animagelistthatcontainsthelargeiconimages.
//IfSHGFI_SMALLICONisincludedwithSHGFI_SYSICONINDEX,thereturnvalue
//isthehandletoanimagelistthatcontainsthesmalliconimages.
//
himlSmall=(HIMAGELIST)SHGetFileInfo((LPCSTR)cSysDir,
0,
&sfi,
sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX|SHGFI_SMALLICON);
himlLarge=(HIMAGELIST)SHGetFileInfo((LPCSTR)cSysDir,
SHGFI_SYSICONINDEX|SHGFI_LARGEICON);
if(himlSmall&&himlLarge)
SendMessage(list.m_hWnd,LVM_SETIMAGELIST,
(WPARAM)LVSIL_SMALL,(LPARAM)himlSmall);
(WPARAM)LVSIL_NORMAL,(LPARAM)himlLarge);
returnTRUE;
步骤2:
给列表添加指定的文件,同时获得该文件的的图标索引,给list添加图标
intGetIconIndex(LPCTSTRlpszPath,BOOLbIsDir,BOOLbSelected);//向前声明
voidAddFiles(CListCtrl&list,LPCTSTRlpszFileName,BOOLbAddToDocument)
intnIcon=GetIconIndex(lpszFileName,FALSE,TRUE);
CStringstrSize;
CFileFindfilefind;
//getfilesize
if(filefind.FindFile(lpszFileName))
filefind.FindNextFile();
strSize.Format("%d",filefind.GetLength());
strSize="0";
//splitpathandfilename
CStringstrFileName=lpszFileName;
CStringstrPath;
intnPos=strFileName.ReverseFind('\\');
if(nPos!
strPath=strFileName.Left(nPos);
strFileName=strFileName.Mid(nPos1);
//inserttolist
intnItem=list.GetItemCount();
//list.InsertItem(nItem,strFileName,nIcon);
//list.SetItemText(nItem,1,strSize);
//此处可以根据实际需要修改代码
19.listctrl内容进行大数据量更新时,避免闪烁
m_list.SetRedraw(FALSE);
//更新内容
m_list.SetRedraw(TRUE);
m_list.Invalidate();
m_list.UpdateWindow();
20.清除ListCtrl以重新初始化:
//删除所有行
m_ctrllist.DeleteAllItems();
//删除所有列
intiColCount=m_ctrllist.GetHeaderCtrl()->GetItemCount();
//方法1
//原理:
删除第一列后,其他列向前移动
while(m_ctrllist.DeleteColumn(0));
//方法2
for(inti=0;i{m_ctrllist.DeleteColumn(0);}
m_ctrllist.DeleteColumn(0);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1