开发环境:visual studio 2008 sp1 1、新建一个基于对话框的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,这里就没必要了,默认的是icon LVCOLUMN 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);
这里添加一点调整列宽的,以下代码可供参考(摘自优快云): voidCMyListView::AutoAdjustColumnWidth() { CHeaderCtrl*pHeaderCtrl=m_pListCtrl->GetHeaderCtrl(); m_pListCtrl->SetRedraw(FALSE);//防止闪烁 pHeaderCtrl->SetRedraw(FALSE);//防止闪烁 intnColumnCount=pHeaderCtrl->GetItemCount(); //获取列数 for(inti=0; i<nColumnCount; 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();//Update Window to redraw. pHeaderCtrl->UpdateWindow(); } 下面就开始设置图片了。 新建两个bitmap资源,大小为16*16,ID分别为IDB_UP和IDB_LOSANGE,初始化函数CDepartmentStoreDlg::OnInitDialog()改为如下: m_StoreItems.SetView(LVS_REPORT); LVCOLUMN lvColumn; CBitmap bmpUP, bmpLosange; bmpUP.LoadBitmap(IDB_UP); bmpLosange.LoadBitmap(IDB_LOSANGE); CImageList *ImgHeaders = new CImageList(); 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("Full Name"); 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("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);
继续完善。给CDepartmentStoreDlg类添加变量: CImageList m_SmallImg; CImageList m_LargeImg; 函数: DWORD GetViewType(void); void SetViewType(DWORD dwViewType); cpp中的实现: DWORD CDepartmentStoreDlg::GetViewType(void) { return (GetStyle() & LVS_TYPEMASK); }
void CDepartmentStoreDlg::SetViewType(DWORD dwViewType) { DWORD dwCurType; HWND hWnd; 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,添加鼠标点击事件的响应函数,如下: void CDepartmentStoreDlg::OnBnClickedLarge() { // TODO: 在此添加控件通知处理程序代码 SetViewType(LVS_ICON); }
void CDepartmentStoreDlg::OnBnClickedSmall() { // TODO: 在此添加控件通知处理程序代码 if( GetViewType() != LVS_SMALLICON) SetViewType(LVS_SMALLICON); }
void CDepartmentStoreDlg::OnBnClickedDetail() { // TODO: 在此添加控件通知处理程序代码 if( GetViewType() != LVS_REPORT) SetViewType(LVS_REPORT); }
void CDepartmentStoreDlg::OnBnClickedList() { // TODO: 在此添加控件通知处理程序代码 if( GetViewType() != LVS_LIST) SetViewType(LVS_LIST); } 窗体上的New Item按钮调用的窗体如下,用来添加数据, 给窗体创建类,并给控件添加相应变量。
m_StoreItems.SetView(LVS_REPORT); LVCOLUMN lvColumn;
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("Item Name"); 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("Unit Price"); 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); New Item按钮的响应函数为(将添加item的类include进来): void CDepartmentStoreDlg::OnBnClickedNewitem() { // TODO: 在此添加控件通知处理程序代码 CNewItemDlg dlg;//这个是添加新数据的窗体类 srand((unsigned)time(NULL)); TCHAR strNumber[20]; int number1 = rand() % 100; int number2 = rand() % 100; wsprintf(strNumber,_T("%d-%d"), number1, number2);
dlg.m_ItemNumber = strNumber;
if (dlg.DoModal()) { LVITEM lvItem; int nItem; int imgNbr;
if( dlg.m_Category == "Babies" ) imgNbr = 0; else if( dlg.m_Category == "Teens" ) imgNbr = 1; else if( dlg.m_Category == "Women" ) imgNbr = 2; else if( 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->m_StoreItems.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_CHECKBOXES);//新加checkbox风格 |
MFC ListCOntrol
最新推荐文章于 2024-11-22 20:41:49 发布