MFC ListControl控件用法.docx
- 文档编号:23228769
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:18
- 大小:295.95KB
MFC ListControl控件用法.docx
《MFC ListControl控件用法.docx》由会员分享,可在线阅读,更多相关《MFC ListControl控件用法.docx(18页珍藏版)》请在冰豆网上搜索。
MFCListControl控件用法
MFCListControl控件用法
开发环境:
visualstudio2008
1、新建一个基于对话框的MFC应用程序。
在对话框上拖放一个listcontrol控件和一个button控件,给listcontrol控件添加一个名为m_StoreItems的变量。
添加button的点击响应函数。
voidCDepartmentStoreDlg:
:
OnBnClickedNewitem()
{
//TODO:
在此添加控件通知处理程序代码
srand((unsigned)time(NULL));
TCHARstrNumber[20];//这里不要定义为char或者CString类型,不然后面lvItem.pszText会报错。
intnumber1=rand()%100;
intnumber2=rand()%100;
wsprintf(strNumber,_T("%d-%d"),number1,number2);
LVITEMlvItem;
lvItem.mask=LVIF_TEXT;
lvItem.iItem=0;
lvItem.iSubItem=0;
lvItem.pszText=strNumber;
m_StoreItems.InsertItem(&lvItem);
}
运行效果如下,效果相当于listbox控件,就是一个列表,一行一行的:
现在设置为报表视图,显示成表格形式。
在初始化函数里添加:
BOOLCDepartmentStoreDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//TODO:
在此添加额外的初始化代码
m_StoreItems.SetView(LVS_REPORT);//如果在属性里面设置了listview的view是report,这里就没必要了,默认的是icon
LVCOLUMNlvColumn;
lvColumn.mask=LVCF_FMT|LVCF_TEXT|LVCF_WIDTH;//掩码设置了fmt值、显示列标题和指定宽度
lvColumn.fmt=LVCFMT_LEFT;//设置作对其模式
lvColumn.cx=120;//设置标题的宽度为120个像素
lvColumn.pszText=_T("FullName");//设置标题(列名)
m_StoreItems.InsertColumn(0,&lvColumn);//添加列,索引为0
lvColumn.mask=LVCF_FMT|LVCF_TEXT|LVCF_WIDTH;
lvColumn.fmt=LVCFMT_LEFT;
lvColumn.cx=100;
lvColumn.pszText=_T("Profession");
m_StoreItems.InsertColumn(1,&lvColumn);
lvColumn.mask=LVCF_FMT|LVCF_TEXT|LVCF_WIDTH;
lvColumn.fmt=LVCFMT_LEFT;
lvColumn.cx=80;
lvColumn.pszText=_T("FavSport");
m_StoreItems.InsertColumn(2,&lvColumn);
lvColumn.mask=LVCF_FMT|LVCF_TEXT|LVCF_WIDTH;
lvColumn.fmt=LVCFMT_LEFT;
lvColumn.cx=75;
lvColumn.pszText=_T("Hobby");
m_StoreItems.InsertColumn(3,&lvColumn);
}
下面给报表添加点实际的内容。
继续在初始化函数里添加:
LVITEMlvItem;
intnItem;
lvItem.mask=LVIF_TEXT;//这里的掩码设置一定要注意,因为item和column的掩码值很像,例如LVIF_TEXT和LVCF_TEXT,I对应的item,C对应的column,不然的话会显示不出来的,这个地方害死我了,因为有插件自动补全代码,补全后没注意看,结果没有对应,郁闷了好一会
lvItem.iItem=0;//行号(索引,从0开始),报表相当于二维数组的模式,添加行内容时要指定行号和列号
lvItem.iSubItem=0;//列号(索引,从0开始)
lvItem.pszText=_T("SandraC.Anschwitz");//内容
nItem=m_StoreItems.InsertItem(&lvItem);//插入这一行,返回行号(索引)
m_StoreItems.SetItemText(nItem,1,_T("Singer"));//设置行索引(行号)和列索引(列号)的值
m_StoreItems.SetItemText(nItem,2,_T("HandBall"));
m_StoreItems.SetItemText(nItem,3,_T("Beach"));
lvItem.mask=LVIF_TEXT;
lvItem.iItem=1;
lvItem.iSubItem=0;
lvItem.pszText=_T("RogerA.Miller");
nItem=m_StoreItems.InsertItem(&lvItem);
m_StoreItems.SetItemText(nItem,1,_T("Footballer"));
m_StoreItems.SetItemText(nItem,2,_T("Tennis"));
m_StoreItems.SetItemText(nItem,3,_T("Teaching"));
lvItem.mask=LVIF_TEXT;
lvItem.iItem=2;
lvItem.iSubItem=0;
lvItem.pszText=_T("Marie-JulieW.Gross");
nItem=m_StoreItems.InsertItem(&lvItem);
m_StoreItems.SetItemText(nItem,1,_T("Student"));
m_StoreItems.SetItemText(nItem,2,_T("Boxing"));
m_StoreItems.SetItemText(nItem,3,_T("Programming"));
lvItem.mask=LVIF_TEXT;
lvItem.iItem=3;
lvItem.iSubItem=0;
lvItem.pszText=_T("EllaPiusRoger");
nItem=m_StoreItems.InsertItem(&lvItem);
m_StoreItems.SetItemText(nItem,1,_T("Architect"));
m_StoreItems.SetItemText(nItem,2,_T("Ping-Pong"));
m_StoreItems.SetItemText(nItem,3,_T("Songo"));
中途小结:
在报表视图中,要做的主要有下面几步:
1)确保当前视图为报表视图,在属性窗口设置view或者在代码中设置为view模式
2)添加列:
用到的数据结构是LVCOLUMN(就是listviewcolumn,对应的掩码也是LVCF_,listviewcolumnformat)
3)添加行:
用到的数据结构是LVITEM(listviewitem,对应的掩码是LVIF_,listviewitemformat)
添加行的时候先添加第一个元素,即行索引为nItem,列索引为0,然后InsertItem,返回当前行的索引,之后就是设置该行的其他元素了,指定行、列索引和设置值即可。
4)删除行:
BOOLDeleteItem(intnItem);删除指定的索引为nItem的行内容。
有时候我们会先选中某行,然后删除,这个时候需要用到函数intGetNextItem(intnItem,intnFlags);从指定的索引nItem(不包括该索引,如果要包括该行的话,设置nItem-1即可)开始寻找满足nFlags条件的Item,成功则返回找到的Item的索引(如果有多个,则返回第一个),失败返回-1.这样的话如果要删除选中的某行,则可以这样实现m_StoreItems.DeleteItem(m_StoreItems.GetNextItem(-1,LVNI_SELECTED));(建议设置扩展风格时,把整行选中设置进来this->m_StoreItems.SetExtendedStyle(LVS_EX_FULLROWSELECT);这样选中的时候就是一行了,否则会是一格)。
如果要删除多行选中的,则可以用下面的代码:
intnIndex;
do
{
nIndex=m_StoreItems.GetNextItem(-1,LVNI_SELECTED);
m_StoreItems.DeleteItem(nIndex);
}while(nIndex!
=-1);
这里添加一点调整列宽的,以下代码可供参考(摘自CSDN):
voidCMyListView:
:
AutoAdjustColumnWidth()
{
CHeaderCtrl*pHeaderCtrl=m_pListCtrl->GetHeaderCtrl();
m_pListCtrl->SetRedraw(FALSE);//防止闪烁
pHeaderCtrl->SetRedraw(FALSE);//防止闪烁
intnColumnCount=pHeaderCtrl->GetItemCount();//获取列数
for(inti=0;i { m_pListCtrl->SetColumnWidth(i,LVSCW_AUTOSIZE); intnColumnWidth=m_pListCtrl->GetColumnWidth(i); m_pListCtrl->SetColumnWidth(i,LVSCW_AUTOSIZE_USEHEADER); intnHeaderWidth=m_pListCtrl->GetColumnWidth(i); m_pListCtrl->SetColumnWidth(i,max(nColumnWidth,nHeaderWidth)+10); } pHeaderCtrl->SetRedraw(TRUE);//此处开启刷新,避免闪烁 m_pListCtrl->SetRedraw(TRUE); pHeaderCtrl->Invalidate();//UpdateWindowtoredraw. pHeaderCtrl->UpdateWindow(); } 下面就开始设置图片了。 新建两个bitmap资源,大小为16*16,ID分别为IDB_UP和IDB_LOSANGE,初始化函数CDepartmentStoreDlg: : OnInitDialog()改为如下: m_StoreItems.SetView(LVS_REPORT); LVCOLUMNlvColumn; CBitmapbmpUP,bmpLosange; bmpUP.LoadBitmap(IDB_UP); bmpLosange.LoadBitmap(IDB_LOSANGE); CImageList*ImgHeaders=newCImageList(); ImgHeaders->Create(16,16,ILC_MASK,1,1); ImgHeaders->Add(&bmpUP,RGB(0,0,0)); ImgHeaders->Add(&bmpLosange,RGB(0,0,0)); m_StoreItems.SetImageList(ImgHeaders,LVSIL_SMALL); lvColumn.mask=LVCF_FMT|LVCF_TEXT|LVCF_WIDTH|LVCF_IMAGE; lvColumn.fmt=LVCFMT_LEFT|LVCFMT_IMAGE; lvColumn.cx=120; lvColumn.pszText=_T("FullName"); lvColumn.iImage=0; m_StoreItems.InsertColumn(0,&lvColumn); lvColumn.mask=LVCF_FMT|LVCF_TEXT|LVCF_WIDTH; lvColumn.fmt=LVCFMT_LEFT; lvColumn.cx=100; lvColumn.pszText=_T("Profession"); m_StoreItems.InsertColumn(1,&lvColumn); lvColumn.mask=LVCF_FMT|LVCF_TEXT|LVCF_WIDTH|LVCF_IMAGE; lvColumn.fmt=LVCFMT_LEFT|LVCFMT_IMAGE; lvColumn.iImage=1; lvColumn.cx=80; lvColumn.pszText=_T("FavSport"); m_StoreItems.InsertColumn(2,&lvColumn); lvColumn.mask=LVCF_FMT|LVCF_TEXT|LVCF_WIDTH; lvColumn.fmt=LVCFMT_LEFT; lvColumn.cx=75; lvColumn.pszText=_T("Hobby"); m_StoreItems.InsertColumn(3,&lvColumn); 继续完善。 给CDepartmentStoreDlg类添加变量: CImageListm_SmallImg; CImageListm_LargeImg; 函数: DWORDGetViewType(void); voidSetViewType(DWORDdwViewType); cpp中的实现: DWORDCDepartmentStoreDlg: : GetViewType(void) { return(GetStyle()&LVS_TYPEMASK); } voidCDepartmentStoreDlg: : SetViewType(DWORDdwViewType) { DWORDdwCurType; HWNDhWnd; hWnd=this->m_StoreItems; GetSafeHwnd(); dwCurType=: : GetWindowLong(hWnd,GWL_STYLE); dwCurType&=~LVS_TYPEMASK; dwViewType|=dwCurType; : : SetWindowLong(hWnd,GWL_STYLE,dwViewType); } 窗体上添加Large、Small、List、Details四个button,添加鼠标点击事件的响应函数,如下: voidCDepartmentStoreDlg: : OnBnClickedLarge() { //TODO: 在此添加控件通知处理程序代码 SetViewType(LVS_ICON); } voidCDepartmentStoreDlg: : OnBnClickedSmall() { //TODO: 在此添加控件通知处理程序代码 if(GetViewType()! =LVS_SMALLICON) SetViewType(LVS_SMALLICON); } voidCDepartmentStoreDlg: : OnBnClickedDetail() { //TODO: 在此添加控件通知处理程序代码 if(GetViewType()! =LVS_REPORT) SetViewType(LVS_REPORT); } voidCDepartmentStoreDlg: : OnBnClickedList() { //TODO: 在此添加控件通知处理程序代码 if(GetViewType()! =LVS_LIST) SetViewType(LVS_LIST); } 窗体上的NewItem按钮调用的窗体如下,用来添加数据,给窗体创建类,并给控件添加相应变量。 添加2个位图资源,属性为ID: IDB_LargingWeight: 162Height: 32,ID: IDB_SmallingWeight: 80Height: 16 初始化函数代码: m_StoreItems.SetView(LVS_REPORT); LVCOLUMNlvColumn; lvColumn.mask=LVCF_FMT|LVCF_TEXT|LVCF_WIDTH; lvColumn.fmt=LVCFMT_CENTER; lvColumn.cx=60; lvColumn.pszText=_T("Item#"); this->m_StoreItems.InsertColumn(0,&lvColumn); lvColumn.mask=LVCF_FMT|LVCF_TEXT|LVCF_WIDTH; lvColumn.fmt=LVCFMT_LEFT; lvColumn.cx=100; lvColumn.pszText=_T("Category"); this->m_StoreItems.InsertColumn(1,&lvColumn); lvColumn.mask=LVCF_FMT|LVCF_TEXT|LVCF_WIDTH; lvColumn.fmt=LVCFMT_LEFT; lvColumn.cx=160; lvColumn.pszText=_T("ItemName"); this->m_StoreItems.InsertColumn(2,&lvColumn); lvColumn.mask=LVCF_FMT|LVCF_TEXT|LVCF_WIDTH; lvColumn.fmt=LVCFMT_LEFT; lvColumn.cx=80; lvColumn.pszText=_T("Size"); this->m_StoreItems.InsertColumn(3,&lvColumn); lvColumn.mask=LVCF_FMT|LVCF_TEXT|LVCF_WIDTH; lvColumn.fmt=LVCFMT_RIGHT; lvColumn.cx=60; lvColumn.pszText=_T("UnitPrice"); this->m_StoreItems.InsertColumn(4,&lvColumn); lvColumn.mask=LVCF_FMT|LVCF_TEXT|LVCF_WIDTH; lvColumn.fmt=LVCFMT_RIGHT; lvColumn.cx=30; lvColumn.pszText=_T("Qty"); this->m_StoreItems.InsertColumn(5,&lvColumn); this->m_StoreItems.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);//设置扩展风格 m_SmallImg.Create(IDB_Smalling,16,1,RGB(255,255,255)); m_LargeImg.Create(IDB_Larging,32,1,RGB(255,255,245)); m_StoreItems.SetImageList(&m_SmallImg,LVSIL_SMALL); m_StoreItems.SetImageList(&m_LargeImg,LVSIL_NORMAL); NewItem按钮的响应函数为(将添加item的类include进来): voidCDepartmentStoreDlg: : OnBnClickedNewitem() { //TODO: 在此添加控件通知处理程序代码 CNewItemDlgdlg;//这个是添加新数据的窗体类 srand((unsigned)time(NULL)); TCHARstrNumber[20]; intnumber1=rand()%100; intnumber2=rand()%100; wsprintf(strNumber,_T("%d-%d"),number1,number2); dlg.m_ItemNumber=strNumber; if(dlg.DoModal()) { LVITEMlvItem; intnItem; intimgNbr; if(dlg.m_Category=="Babies") imgNbr=0; elseif(dlg.m_Category=="Teens") imgNbr=1; elseif(dlg.m_Category=="Women") imgNbr=2; elseif(dlg.m_Category=="Men") imgNbr=3; else imgNbr=4; lvItem.mask=LVIF_IMAGE|LVIF_TEXT; lvItem.iItem=0; lvItem.iSubItem=0; lvItem.pszText=strNumber; lvItem.iImage=imgNbr; nItem=this->m_StoreItems.InsertItem(&lvItem); this->m_StoreItems.SetItemText(nItem,1,dlg.m_Category); this->m_StoreItems.SetItemText(nItem,2,dlg.m_ItemName); this->m_StoreItems.SetItemText(nItem,3,dlg.m_ItemSize); this->m_StoreItems.SetItemText(nItem,4,dlg.m_UnitPrice); this->m_StoreItems.SetItemText(nItem,5,dlg.m_Quantity); } } 效果图: this-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MFC ListControl控件用法 ListControl 控件 用法