MFC ListControl控件用法

  • 格式:doc
  • 大小:433.50 KB
  • 文档页数:19

MFC ListControl控件用法开发环境:visual studio 20081、新建一个基于对话框的MFC应用程序。

在对话框上拖放一个listcontrol控件和一个button控件,给listcontrol控件添加一个名为m_StoreItems的变量。

添加button的点击响应函数。

void CDepartmentStoreDlg::OnBnClickedNewitem(){// TODO: 在此添加控件通知处理程序代码srand((unsigned)time(NULL));TCHAR strNumber[20];//这里不要定义为char或者CString类型,不然后面lvItem.pszText会报错。

int number1 = rand() % 100;int number2 = rand() % 100;wsprintf(strNumber,_T("%d-%d"), number1, number2);LVITEM lvItem;lvItem.mask = LVIF_TEXT;lvItem.iItem = 0;lvItem.iSubItem = 0;lvItem.pszText = strNumber;m_StoreItems.InsertItem(&lvItem);}运行效果如下,效果相当于listbox控件,就是一个列表,一行一行的:现在设置为报表视图,显示成表格形式。

在初始化函数里添加:BOOL CDepartmentStoreDlg::OnInitDialog(){CDialog::OnInitDialog();// TODO: 在此添加额外的初始化代码m_StoreItems.SetView(LVS_REPORT);//如果在属性里面设置了listview的view是report,这里就没必要了,默认的是iconLVCOLUMN lvColumn;lvColumn.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH; //掩码设置了fmt值、显示列标题和指定宽度lvColumn.fmt = LVCFMT_LEFT; //设置作对其模式lvColumn.cx = 120; //设置标题的宽度为120个像素lvColumn.pszText = _T("Full Name"); //设置标题(列名)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("Fav Sport");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);}下面给报表添加点实际的内容。

继续在初始化函数里添加:LVITEM lvItem;int nItem;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("Sandra C. 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("Roger A. 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-Julie W. 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("Ella Pius Roger");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 (就是list view column,对应的掩码也是LVCF_,list view column format)3)添加行:用到的数据结构是LVITEM (list view item,对应的掩码是LVIF_,list view item format)添加行的时候先添加第一个元素,即行索引为nItem,列索引为0,然后InsertItem,返回当前行的索引,之后就是设置该行的其他元素了,指定行、列索引和设置值即可。

4)删除行:BOOL DeleteItem(int nItem);删除指定的索引为nItem的行内容。

有时候我们会先选中某行,然后删除,这个时候需要用到函数int GetNextItem(int nItem, int nFlags);从指定的索引nItem(不包括该索引,如果要包括该行的话,设置nItem -1即可)开始寻找满足nFlags条件的Item,成功则返回找到的Item的索引(如果有多个,则返回第一个),失败返回-1.这样的话如果要删除选中的某行,则可以这样实现m_StoreItems.DeleteItem(m_StoreItems.GetNextItem(-1,LVNI_SELECTED));(建议设置扩展风格时,把整行选中设置进来this->m_StoreItems.SetExtendedStyle( LVS_EX_FULLROWSELECT);这样选中的时候就是一行了,否则会是一格)。

如果要删除多行选中的,则可以用下面的代码:int nIndex;do{nIndex = m_StoreItems.GetNextItem(-1,LVNI_SELECTED);m_StoreItems.DeleteItem(nIndex);} while (nIndex != -1);这里添加一点调整列宽的,以下代码可供参考(摘自CSDN):void CMyListView::AutoAdjustColumnWidth(){CHeaderCtrl*pHeaderCtrl=m_pListCtrl->GetHeaderCtrl();m_pListCtrl->SetRedraw(FALSE);//防止闪烁pHeaderCtrl->SetRedraw(FALSE);//防止闪烁int nColumnCount=pHeaderCtrl->GetItemCount(); //获取列数for(int i=0; i<nColumnCount; i++){m_pListCtrl->SetColumnWidth(i, LVSCW_AUTOSIZE);int nColumnWidth=m_pListCtrl->GetColumnWidth(i);m_pListCtrl->SetColumnWidth(i, LVSCW_AUTOSIZE_USEHEADER);int nHeaderWidth=m_pListCtrl->GetColumnWidth(i);m_pListCtrl->SetColumnWidth(i, max(nColumnWidth, nHeaderWidth)+10);}pHeaderCtrl->SetRedraw(TRUE);//此处开启刷新,避免闪烁m_pListCtrl->SetRedraw(TRUE);pHeaderCtrl->Invalidate();//Update Window to redraw.pHeaderCtrl->UpdateWindow();}下面就开始设置图片了。