CListView用法.docx
- 文档编号:18472810
- 上传时间:2023-08-18
- 格式:DOCX
- 页数:10
- 大小:55.15KB
CListView用法.docx
《CListView用法.docx》由会员分享,可在线阅读,更多相关《CListView用法.docx(10页珍藏版)》请在冰点文库上搜索。
CListView用法
CListView用法
【转】CListView常用用法(上)
2010-01-1217:
23
一个程序从宏观上来说,不外乎就是输入->处理->输出,输入与输出对一个程序来说至关重要。
前段时间给可视化平台换脸的时候,平台的输出不仅包括直观的图像显示,用户还希望直观地得到每帧图像的一些相关的参数信息、统计信息等,这时候我就选择在CListView中滚动地显示相关信息,并将窗口进行切分,将CListView的窗口放在整个主窗口的最底端,在需要的时候显示,不需要的时候隐藏。
但是,我对CListView的用法不是很熟悉,在查MSDN和从网上查相关用法的时候,要不就是零星地介绍,要不就是只介绍CListCtrl的用法,这让我走了很多弯路,为此,我将从网上查到的用法,结合我的实际应用,简单介绍下CListView的使用,希望对像我一样对CListView不熟悉或刚接触MFC编程的人有所帮助,对一些编程老手、高手来说,这些自然不在话下。
CListView中内置了CListCtrl,所以对CListView的操作实际上就是对内置CListCtrl的操作。
下面就从新建一个CListView的子类开始,我从工程中新建了一个叫做CInfoView的类,基类选择CListView。
1、初始化CListView,设置风格,背景和字体颜色,初始化行列。
该项工作在OnInitialUpdate()中完成,如下所示。
voidCInfoView:
:
OnInitialUpdate()
{
CListView:
:
OnInitialUpdate();
//TODO:
Addyourspecializedcodehereand/orcallthebaseclass
CListCtrl&m_list=GetListCtrl();//得到内置的listctrl引用
LONGlStyle;
lStyle=GetWindowLong(m_list.m_hWnd,GWL_STYLE);//获取当前窗口风
3、右键单击弹出浮动菜单。
在我的应用中,右键弹出的浮动菜单,只有一项:
“删除所有内容”。
要弹出浮动菜单,首先先要在“资源”的“Menu”中新建一个Menu,ID命名为IDR_POPMENU,然后在该Menu中添加一个主菜单“操作”,在“操作”下添加一个子菜单“删除所有内容”,ID命名为“ID_DELETE_ALL”,通过向导在CInfoView中给ID_DELETE_ALL添加消息响应函数OnDeleteAll(),如下:
voidCInfoView:
:
OnDeleteAll()
{
CListCtrl&m_list=GetListCtrl();
m_list.DeleteAllItems();
}
然后通过向导在CInfoView中添加右键单击响应函数=NM_RCLICK,如下:
voidCInfoView:
:
OnRclick(NMHDR*pNMHDR,LRESULT*pResult)
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CListCtrl&m_list=GetListCtrl();//获取当前列表控件的指针
CMenumenu,*pSubMenu;//定义下面要用到的cmenu对象
menu.LoadMenu(IDR_POPMENU);//装载自定义的右键菜单
pSubMenu=menu.GetSubMenu(0);//获取第一个弹出菜单
CPointoPoint;//定义一个用于确定光标位置的位置
GetCursorPos(&oPoint);//获取当前光标的位置
//在指定位置显示弹出菜单
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,oPoint.x,oPoint.y,this);
}
转】CListView常用用法(中)
4、添加消息响应函数OnCustomDraw(),为ClistCtrl的每个Item设置不同的颜色,在该应用中,为单数和偶数的Item项设置两种不同的颜色。
具体步骤如下:
首先在InfoView.h的AFX_MSG之间添加消息函数声明:
afx_msgvoidOnCustomDraw(NMHDR*pNMHDR,LRESULT*pResult);
然后在InfoView.cpp的BEGIN_MESSAGE_MAP之间添加消息映射:
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW,OnCustomDraw)
最后在InfoView.cpp中添加函数实现:
voidCInfoView:
:
OnCustomDraw(NMHDR*pNMHDR,LRESULT*pResult)
{
LPNMLVCUSTOMDRAWlplvcd=(LPNMLVCUSTOMDRAW)pNMHDR;
switch(lplvcd->nmcd.dwDrawStage)
{
intiRow;
caseCDDS_PREPAINT:
*pResult=CDRF_NOTIFYITEMDRAW;
break;
caseCDDS_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中声明两个静态的回调函数:
staticintCALLBACKListViewCompareFunc(LPARAMlParam1,LPARAMlParam2,LPARAMlParamSort);//按字串排序
staticintCALLBACKListViewCompareIntFunc(LPARAMlParam1,LPARAMlParam2,LPARAMlParamSort);//按自然数排序
在InfoView.cpp中实现两个静态的回调函数:
intCALLBACKCInfoView:
:
ListViewCompareFunc(LPARAMlParam1,LPARAMlParam2,LPARAMlParamSort)
{
//得到排序方式
int*pisortorder=(int*)lParamSort;
//得到两个列的排序信息
TCHAR*sz1=(TCHAR*)lParam1;
TCHAR*sz2=(TCHAR*)lParam2;
//比较列的信息并返回比较结果。
//若为减序,则将比较结果乘上-1。
if(*pisortorder==LVS_SORTASCENDING)
returnlstrcmp(sz1,sz2);
else
returnlstrcmp(sz1,sz2)*(-1);
}
intCALLBACKCInfoView:
:
ListViewCompareIntFunc(LPARAMlParam1,LPARAMlParam2,LPARAMlParamSort)
{
//得到排序方式
int*pisortorder=(int*)lParamSort;
//得到两个列的排序信息
TCHAR*sz1=(TCHAR*)lParam1;
TCHAR*sz2=(TCHAR*)lParam2;
intn1=_ttoi(sz1);
intn2=_ttoi(sz2);
//比较列的信息并返回比较结果。
//若为减序,则将比较结果乘上-1。
if(*pisortorder==LVS_SORTASCENDING)
{
if(n1-n2>0)return1;
elseif(n1-n2==0)return0;
elsereturn-1;
}
else
{
if(n1-n2>0)return-1;
elseif(n1-n2==0)return0;
elsereturn1;
}
}
【转】CListView常用用法(下)
然后通过向导为事件LVN_COLUMNCLICK添加消息响应函数OnColumnclick(),在该函数中调用上面的回调函数
voidCInfoView:
:
OnColumnclick(NMHDR*pNMHDR,LRESULT*pResult)
{
//TODO:
Addyourcontrolnotificationhandlercodehere
staticintncurSortCol=-1;//保存当前的排序列。
//一开始表示为-1,表示尚未按任何列排序。
NM_LISTVIEW*pNMListView=(NM_LISTVIEW*)pNMHDR;
CListCtrl*lc=&GetListCtrl();
LONGws=GetWindowLong(lc->m_hWnd,GWL_STYLE);
intnSortOrder;//排序的方式
//若点击列与当前排序列不同的列,则改变排序序,并将排序方式改为增序。
//若当前排序列与点击列相同,则更改增、减序的排序方式
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用新排序列的内容替换
LVITEMli;
li.mask=LVIF_PARAM|LVIF_TEXT;
TCHARszItemText[1024];
for(inti=0;i
{
li.iItem=i;
li.iSubItem=ncurSortCol;
li.cchTextMax=1024;
li.pszText=szItemText;
lc->GetItem(&li);
TCHAR*szlparam=(TCHAR*)li.lParam;
//删除以前的信息,释放空间
//添加ListItem时应注意将lParam初始化NULL
if(szlparam!
=NULL)
deleteszlparam;
//复制当前列的szItemText到Item的lParam中
szlparam=newTCHAR[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;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CListView 用法