CListView用法.doc_第1页
CListView用法.doc_第2页
CListView用法.doc_第3页
CListView用法.doc_第4页
CListView用法.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【转】CListView常用用法(上)2010-01-12 17:23一个程序从宏观上来说,不外乎就是输入-处理-输出,输入与输出对一个程序来说至关重要。前段时间给可视化平台换脸的时候,平台的输出不仅包括直观的图像显示,用户还希望直观地得到每帧图像的一些相关的参数信息、统计信息等,这时候我就选择在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 classCListCtrl& 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(fConfidnIndex TrackPopupMenu(TPM_LEFTALIGN, oPoint.x, oPoint.y, this); 转】CListView常用用法(中) 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);elsereturn 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;elseif(n1 - n2 0) return -1;else if(n1 -n2 = 0) return 0;else return 1;【转】CListView常用用法(下) 然后通过向导为事件LVN_COLUMNCLICK添加消息响应函数OnColumnclick(),在该函数中调用上面的回调函数void CInfoView:OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult)/ TODO: Add your control notification handler code herestatic 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;elsews = LVS_SORTDESCENDING;nSortOrder = LVS_SORTASCENDING;elseif (ws & LVS_SORTASCENDING)nSortOrder = LVS_SORTDESCENDING;ncurSortCol = pNMListView-iSubItem;elsenSortOrder = 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 szItemText1024;for (int i = 0; i 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初始化NULLif (szlparam != NULL)delete szlparam;/ 复制当前列的szItemText到Item的lParam中szlparam = new TCHARlstrlen

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论