`
hcmfys
  • 浏览: 356392 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

CListView

 
阅读更多

一个程序从宏观上来说,不外乎就是输入->处理->输出,输入与输出对一个程序来说至关重要。前段时间给可视化平台换脸的时候,平台的输出不仅包括直观的图像显示,用户还希望直观地得到每帧图像的一些相关的参数信息、统计信息等,这时候我就选择在CListView中滚动地显示相关信息,并将窗口进行切分,将CListView的窗口放在整个主窗口的最底端,在需要的时候显示,不需要的时候隐藏。但是,我对CListView的用法不是很熟悉,在查MSDN和从网上查相关用法的时候,要不就是零星地介绍,要不就是只介绍CListCtrl的用法,这让我走了很多弯路,为此,我将从网上查到的用法,结合我的实际应用,简单介绍下CListView的使用,希望对像我一样对CListView不熟悉或刚接触MFC编程的人有所帮助,对一些编程老手、高手来说,这些自然不在话下。 CListView中内置了CListCtrl,所以对CListView的操作实际上就是对内置CListCtrl的操作。下面就从新建一个CListView的子类开始,我从工程中新建了一个叫做CInfoView的类,基类选择CListView。 1、初始化CListView,设置风格,背景和字体颜色,初始化行列。该项工作在OnInitialUpdate()中完成,如下所示。 void CInfoView::OnInitialUpdate() { CListView::OnInitialUpdate(); // TODO: Add your specialized code here and/or call the base class CListCtrl& m_list = GetListCtrl();//得到内置的listctrl引用 LONG lStyle; lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口风格 lStyle &= ~LVS_TYPEMASK; //清除显示方式位 lStyle |= LVS_REPORT; //设置报表风格 SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle); //设置窗口风格 DWORD dwStyle = m_list.GetExtendedStyle(); //选中某行使整行高亮(只适用于报表风格的listctrl) dwStyle |= LVS_EX_FULLROWSELECT; dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与报表风格的listctrl) m_list.SetExtendedStyle(dwStyle); //设置扩展风格 m_list.SetBkColor(RGB(200, 200, 200)); //设置背景颜色 m_list.SetTextBkColor(RGB(200, 200, 200)); //设置文本背景颜色 m_list.SetTextColor(RGB(10, 10, 80)); //设置文本颜色 //插入列的标题,为了简单起见,我只插入三列 m_list.InsertColumn( 0, "图像帧号", LVCFMT_CENTER, 80 ); m_list.InsertColumn( 1, "可见性判断", LVCFMT_CENTER, 110 ); m_list.InsertColumn( 2, "置信度结果", LVCFMT_CENTER, 110 ); } 2、插入一行数据。一般在实际应用中,都是在程序运行中,插入一行数据,这时候,需要在当前的程序语境中得到CInfoView的指针,然后进行插入数据的操作。在我的应用中,我把CinfoView作为拆分窗口的一个子窗口,所以具体操作如下: CListView*listview=(CListView*)(((CMainFrame*)theApp.GetMainWnd())->m_wndSplitter1.GetPane(1,0));//得到ListView的指针 CListCtrl& list = listview->GetListCtrl();//得到listview内置listctrl的引用 CString strId, strCo;//图像帧号,置信度 CString strVb = "Y"; //可见性 if(fConfid[nIndex] <= 0) { strVb = "N"; } strId.Format("%d", nIndex+1); strCo.Format("% .4f", fConfid[nIndex]); //插入一行数据,始终在顶端插入新的数据 int nRow = list.InsertItem(0, strId); list.SetItemText(nRow, 1, strVb); list.SetItemText(nRow, 2, strCo); 3、右键单击弹出浮动菜单。在我的应用中,右键弹出的浮动菜单,只有一项:“删除所有内容”。要弹出浮动菜单,首先先要在“资源”的“Menu”中新建一个Menu,ID命名为IDR_POPMENU,然后在该Menu中添加一个主菜单“操作”,在“操作”下添加一个子菜单“删除所有内容”,ID命名为“ID_DELETE_ALL”,通过向导在CInfoView中给ID_DELETE_ALL添加消息响应函数OnDeleteAll(),如下: void CInfoView::OnDeleteAll() { CListCtrl &m_list = GetListCtrl(); m_list.DeleteAllItems(); } 然后通过向导在CInfoView中添加右键单击响应函数=NM_RCLICK,如下: void CInfoView::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here CListCtrl &m_list = GetListCtrl(); //获取当前列表控件的指针 CMenu menu, *pSubMenu; //定义下面要用到的cmenu对象 menu.LoadMenu(IDR_POPMENU); //装载自定义的右键菜单 pSubMenu = menu.GetSubMenu(0); //获取第一个弹出菜单 CPoint oPoint; //定义一个用于确定光标位置的位置 GetCursorPos(&oPoint); //获取当前光标的位置 //在指定位置显示弹出菜单 pSubMenu->TrackPopupMenu(TPM_LEFTALIGN, oPoint.x, oPoint.y, this); } 4、添加消息响应函数OnCustomDraw(),为ClistCtrl的每个Item设置不同的颜色,在该应用中,为单数和偶数的Item项设置两种不同的颜色。具体步骤如下: 首先在InfoView.h的AFX_MSG之间添加消息函数声明: afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult); 然后在InfoView.cpp的BEGIN_MESSAGE_MAP之间添加消息映射: ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw) 最后在InfoView.cpp中添加函数实现: void CInfoView::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) { LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR; switch(lplvcd->nmcd.dwDrawStage) { int iRow; case CDDS_PREPAINT: *pResult = CDRF_NOTIFYITEMDRAW; break; case CDDS_ITEMPREPAINT: *pResult = CDRF_DODEFAULT; iRow= lplvcd->nmcd.dwItemSpec; if(iRow & 1) { lplvcd->clrTextBk = RGB(230, 230, 230); //lplvcd->clrText = RGB(255, 255, 0); *pResult = CDRF_NEWFONT; } break; default: *pResult = CDRF_DODEFAULT; } } 5、为CInfoView添加点击列的标题进行排序的消息响应函数,在添加该消息响应函数之前,先要定义实现排序的回调函数。在该应用中,第一列是图像帧号,按自然数排序,其他列都按字串进行排列,所以定义两个比较的回调函数。 在InfoView.h中声明两个静态的回调函数: static int CALLBACK ListViewCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);//按字串排序 static int CALLBACK ListViewCompareIntFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);//按自然数排序 在InfoView.cpp中实现两个静态的回调函数: int CALLBACK CInfoView::ListViewCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { // 得到排序方式 int *pisortorder = (int *)lParamSort; // 得到两个列的排序信息 TCHAR *sz1 = (TCHAR *)lParam1; TCHAR *sz2 = (TCHAR *)lParam2; // 比较列的信息并返回比较结果。 // 若为减序,则将比较结果乘上-1。 if (*pisortorder == LVS_SORTASCENDING) return lstrcmp(sz1, sz2); else return lstrcmp(sz1, sz2) * (-1); } int CALLBACK CInfoView::ListViewCompareIntFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { // 得到排序方式 int *pisortorder = (int *)lParamSort; // 得到两个列的排序信息 TCHAR *sz1 = (TCHAR *)lParam1; TCHAR *sz2 = (TCHAR *)lParam2; int n1 = _ttoi(sz1); int n2 = _ttoi(sz2); // 比较列的信息并返回比较结果。 // 若为减序,则将比较结果乘上-1。 if(*pisortorder == LVS_SORTASCENDING) { if(n1 - n2 > 0) return 1; else if(n1 -n2 == 0) return 0; else return -1; } else { if(n1 - n2 > 0) return -1; else if(n1 -n2 == 0) return 0; else return 1; } } 然后通过向导为事件LVN_COLUMNCLICK添加消息响应函数OnColumnclick(),在该函数中调用上面的回调函数 void CInfoView::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here static int ncurSortCol = -1; // 保存当前的排序列。 // 一开始表示为-1,表示尚未按任何列排序。 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; CListCtrl* lc = &GetListCtrl(); LONG ws = GetWindowLong(lc->m_hWnd, GWL_STYLE); int nSortOrder; // 排序的方式 // 若点击列与当前排序列不同的列,则改变排序序,并将排序方式改为增序。 // 若当前排序列与点击列相同,则更改增、减序的排序方式 if (ncurSortCol == pNMListView->iSubItem) { if (ws & LVS_SORTASCENDING) { ws ^= LVS_SORTASCENDING; nSortOrder = LVS_SORTDESCENDING; } else { ws ^= LVS_SORTDESCENDING; nSortOrder = LVS_SORTASCENDING; } } else { if (ws & LVS_SORTASCENDING) { nSortOrder = LVS_SORTDESCENDING; ncurSortCol = pNMListView->iSubItem; } else { nSortOrder = LVS_SORTASCENDING; ncurSortCol = pNMListView->iSubItem; } } // 将当前的排序信息保存在窗口Style中,供以后使用 ws |= nSortOrder; SetWindowLong(lc->m_hWnd, GWL_STYLE, ws); // 将各ITEM的LPARAM用新排序列的内容替换 LVITEM li; li.mask = LVIF_PARAM|LVIF_TEXT; TCHAR szItemText[1024]; for (int i = 0; i < lc->GetItemCount(); i++) { li.iItem = i; li.iSubItem = ncurSortCol; li.cchTextMax = 1024; li.pszText = szItemText; lc->GetItem(&li); TCHAR * szlparam = (TCHAR *)li.lParam; // 删除以前的信息,释放空间 // 添加List Item时应注意将lParam初始化NULL if (szlparam != NULL) delete szlparam; // 复制当前列的szItemText到Item的lParam中 szlparam = new TCHAR[lstrlen(szItemText) + 1]; lstrcpy(szlparam, szItemText); lc->SetItemData(i, DWORD(szlparam)); } // 开始排序 if(ncurSortCol == 0)//第一列按整数排序 { GetListCtrl().SortItems(ListViewCompareIntFunc,(LPARAM)(&nSortOrder)); } else GetListCtrl().SortItems(ListViewCompareFunc,(LPARAM)(&nSortOrder)); *pResult = 0; }

分享到:
评论

相关推荐

    CListView(列表视图)设置不同行为不同的颜色

    在MFC(Microsoft Foundation Classes)框架中,CListView是一个用于创建和管理列表视图控件的类,它基于Windows API中的LISTVIEW控件。列表视图控件是一种强大的用户界面元素,可以显示多列数据,并支持多种视图...

    CListView用法

    CListView是MFC(Microsoft Foundation Class)库中的一个重要组件,主要用于在Windows应用程序中展示列表视图控件。这种控件通常用于数据的列式显示,用户可以方便地浏览、排序和选择列表中的条目。本篇文章将深入...

    CTreeView与CListView联合

    本案例主要探讨的是`CTreeView`和`CListView`这两种控件的联合使用,以及如何在一个切分窗口中展示它们。`CTreeView`通常用于创建树形结构,展示层次关系的数据,而`CListView`则常用于显示表格形式的信息,两者结合...

    CList CListView C++ C VC

    在C++编程中,`CList`和`CListView`是MFC(Microsoft Foundation Classes)库中的两个关键组件,主要用于数据管理和用户界面呈现。这里我们将深入探讨这两个类以及与C++和VC(Visual C++)相关的知识。 首先,让...

    MFC CListView类应用 示例

    在Microsoft Foundation Classes (MFC)库中,CListView类是一个重要的组件,用于创建具有列表视图功能的用户界面。这个类是基于Windows API中的ListView控制的封装,它提供了丰富的功能,如显示各种类型的列表项、...

    VC++ 在列表视图(CListView)中使用列表控件----ListViewDemo

    在Microsoft Visual C++ (VC++) 开发环境中,`CListView` 是MFC(Microsoft Foundation Classes)框架中的一个类,用于创建和管理Windows的列表视图控件。本教程将深入探讨如何在VC++中利用`CListView`进行开发,...

    CListView使用

    CListView是MFC(Microsoft Foundation Classes)框架中用于创建列表视图控件的类,它在Windows应用程序开发中被广泛使用。CListView是基于Windows API中的LISTVIEW控制类的封装,提供了一种方便的方式来显示和操作...

    在动态集中使用虚拟CListView(53KB)

    在动态集中使用虚拟CListView(53KB)

    在动态集中使用虚拟CListView.rar_clistVIEW

    在这个特定的场景中,我们关注的是如何在动态集中使用虚拟CListView。CListView是MFC中一个重要的视图类,用于显示列表形式的数据,通常与数据库操作相结合。下面将详细介绍这个知识点。 CListView是MFC对Windows ...

    CTreeView与CListView实例

    本实例主要关注的是CTreeView和CListView,这两个类是MFC中用于构建图形用户界面,特别是树视图和列表视图控件的重要组成部分。 CTreeView是MFC提供的一个类,它继承自CView,并且与CTreeCtrl关联。CTreeView主要...

    CListView用法.pdf

    CListView是MFC框架中用于显示列表视图控件的类,它继承自CView类,并内嵌了CListCtrl,使得我们可以方便地管理和显示列表数据。CListView常用于创建具有表格样式的用户界面,例如在应用程序中展示一系列条目信息。...

    一个CTreeView与CListView联合与通信的实例

    在这个实例中,我们关注的是`CTreeView`和`CListView`类的联合使用以及它们之间的通信,这些都是MFC中的核心组件。 `CTreeView`是MFC中用于实现树形控件视图的类,通常在Windows应用程序中用来展示层次结构的数据。...

    Catching header messages in a CListView捕捉CListView的头消息

    在Windows编程中,CListView是MFC(Microsoft Foundation Classes)框架提供的一种用于创建列表视图控件的类。它允许用户以列表、图标、详细信息等多种形式显示数据,并且可以处理用户的各种交互操作,如排序、选择...

    clistview类、CFileDialog类、C++超级链接

    **clistview类** `clistview`是MFC(Microsoft Foundation Classes)库中的一个类,它扩展了Windows标准的`ListView`控件。`clistview`主要用于在对话框或框架窗口中显示列表项,通常用于数据的列式展示,支持多列...

    一个CTreeView与CListView联合使用的实例

    本文将深入探讨如何在MFC环境中结合使用`CTreeView`和`CListView`控件,实现一个单文档界面(SDI)应用,其中包含一个树视图和一个列表视图。 `CTreeView`是MFC中用于创建和管理树形控件的类,通常用于显示层次结构...

    点击CTreeview刷新CListview内容

    4. **刷新CListView**:使用CListView的`SetRedraw(false)`暂时禁用绘图以提高性能,然后清空列表视图(`DeleteAllItems()`),接着根据获取到的数据重新填充CListView(可能涉及到`InsertItem()`, `SetItemData()`,...

    实现两个CListView视图滚动条同步,并实现共享滚动条的实例

    本文将深入探讨如何实现两个`CListView`视图的滚动条同步,以及如何让它们共享一个滚动条,同时隐藏`CListView`自身的滚动条。这在创建多面板界面时非常有用,可以提供一致的用户体验。 首先,我们要了解`CListView...

Global site tag (gtag.js) - Google Analytics