MFCCListCtrl类归类大全.docx
《MFCCListCtrl类归类大全.docx》由会员分享,可在线阅读,更多相关《MFCCListCtrl类归类大全.docx(22页珍藏版)》请在冰豆网上搜索。
MFCCListCtrl类归类大全
MFC:
CListCtrl类
SDK:
以“ListView_”开头的一些宏。
如ListView_InsertColumn
--------------------------------------------------------------------------------
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) { //方法一: //方法二: *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中的itemQ131284: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_LARGEICON); if(himlSmall&&himlLarge) { ::SendMessage(m_list.m_hWnd,LVM_SETIMAGELIST, (WPARAM)LVSIL_SMALL,(LPARAM)h
{
if(m_list.GetItemState(i,LVIS_SELECTED)==LVIS_SELECTED||m_list.GetCheck(i))
str.Format(_T("第%d行的checkbox为选中状态"),i);
AfxMessageBox(str);
}
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); 关于得到设置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) { //方法一: //方法二: *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中的itemQ131284: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_LARGEICON); if(himlSmall&&himlLarge) { ::SendMessage(m_list.m_hWnd,LVM_SETIMAGELIST, (WPARAM)LVSIL_SMALL,(LPARAM)h
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);
关于得到设置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)
//方法一:
//方法二:
*pResult=0;
14.判断是否点击在listctrl的checkbox上
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上");
15.右键点击listctrl的item弹出菜单
添加listctrl控件的NM_RCLICK消息相应函数
OnRclickList1(NMHDR*pNMHDR,LRESULT*pResult)
NM_LISTVIEW*pNMListView=(NM_LISTVIEW*)pNMHDR;
if(pNMListView->iItem!
=-1)
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控件的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,
SHGFI_SYSICONINDEX|SHGFI_LARGEICON);
if(himlSmall&&himlLarge)
SendMessage(m_list.m_hWnd,LVM_SETIMAGELIST,
(WPARAM)LVSIL_SMALL,(LPARAM)h
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1