- 浏览: 71204 次
- 性别:
- 来自: 上海
文章分类
最新评论
CListCtrl::SortItems的用法:
(一)SortItems使用在哪?
CListCtrl::SortItems的原型是:
BOOL SortItems( PFNLVCOMPARE pfnCompare, DWORD dwData );
其中
1)第一个参数pfnCompare为回调函数,形式为:
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2,
LPARAM lParamSort);
lParam1,lParam2是什么?这是SortItems难理解的原因。在(二)中介绍。
lParamSort实际上是列数,等于2)中的dwData。
2)第二个参数dwData为用户自定义值。
dwData实际传入的是列数,等于1)中的lParamSort。
下面是SortItems使用的地方:
//LVN_COLUMNCLICK消息响应函数
void CUpListCtrl::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult)
...{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
//排序
//CompareFunc是回调函数
//pNMListView->iSubItem就是列数
SortItems( (PFNLVCOMPARE)CompareFunc, pNMListView->iSubItem );
*pResult = 0;
}
(二)SortItems的的回调函数的中的lParam1,lParam2是什么?
简单的说:是LV_ITEM::lParam。
LV_ITEM是个结构,见msdn。
可见,我们在向CListCtrl插入item时,必须使用
int InsertItem( const LVITEM* pItem );
InsertItem有好几种形式,只有这种形式才能够使用LV_ITEM::lParam。
下面是插入item的代码的一个示例:
tagInfo *pFileInfo = new tagInfo;//tagInfo是个结构,存储了你排序的所需要的信息。
pFileInfo->strFileName = strFileName;
pFileInfo->strFileSize = FormatFileSize(filefind.GetLength());
pFileInfo->strFileType = GetTypeName(lpszFileName);
//pFileInfo->strFilePath = strPath;
int nItem = GetItemCount();
int nIcon = GetIconIndex(lpszFileName, filefind.IsDirectory(), FALSE);
LV_ITEM lvi;
lvi.mask = LVIF_TEXT|LVIF_PARAM|LVIF_IMAGE;
lvi.iItem = nItem;
lvi.iSubItem = 0;
lvi.pszText = (LPTSTR)(LPCTSTR)pFileInfo->strFileName;
lvi.lParam = (LPARAM)pFileInfo;
lvi.iImage = nIcon;
if( (nItem = InsertItem(&lvi)) != -1 )//插入文件名(即第0列),并显示相应图标
...{
//MessageInt(nItem);
lvi.mask = LVIF_TEXT;
lvi.iItem = nItem;
//设置第1列(即设置文件大小)
lvi.iSubItem = 1;
if(!filefind.IsDirectory())//如果不是目录
...{
lvi.pszText = (LPTSTR)(LPCTSTR)pFileInfo->strFileSize;
SetItem( &lvi );
}
else//如果是目录
...{
lvi.pszText = (LPTSTR)YCT_UNKNOW_SIZE;
SetItem( &lvi );
}
//设置第2列(即设置文件类型)
lvi.iSubItem = 2;
lvi.pszText = (LPTSTR)(LPCTSTR)pFileInfo->strFileType;
SetItem( &lvi );
//设置第3列(即设置文件所在目录)
lvi.iSubItem = 3;
lvi.pszText = (LPTSTR)(LPCTSTR)strPath;
SetItem( &lvi );
//更新界面
//Update( lvi.iItem );
}
现在lParam指向的是new出来的空间,当然要用delete删除。以下是删除代码:
//LVN_DELETEITEM消息响应函数
//每删除一个item,系统都要自动调用这个函数的
void CUpListCtrl::OnDeleteitem(NMHDR* pNMHDR, LRESULT* pResult)
...{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
//删除LV_ITEM::lParam所指向的空间
LV_ITEM lvi;
lvi.mask = LVIF_PARAM;
lvi.iItem = pNMListView->iItem;
lvi.iSubItem = 0;
if ( GetItem( &lvi ) )
...{
CUpListCtrl::tagInfo* pInfo = (CUpListCtrl::tagInfo*)(lvi.lParam);
delete pInfo;
}
*pResult = 0;
}
(三)编写回调函数
这个就比较简单了,按你的规则排序就可以了。
这里回调函数是个静态成员函数。
//回调函数
int CALLBACK CUpListCtrl::CompareFunc(CUpListCtrl::tagInfo* pInfo1, CUpListCtrl::tagInfo* pInfo2, LPARAM lCol)
...{
//CListCtrl::SortItems使用的回调函数
//[IN]pInfo1,pInfo2:传入的是LV_ITEM::lParam,在调用InsertItem(const LVITEM* pItem)时指定
//[IN]lCol:指定列数(从零开始),即按哪一列排序
int nRet = 0;
ASSERT(lCol>=0 && lCol<NumCol-1);
ASSERT(pInfo1 != NULL);
ASSERT(pInfo2 != NULL);
switch(lCol)
...{
case 0://0列
//自己按0列规则排序代码
//想要pInfo1(所代表的item)排在pInfo2(所代表的item)之前,则nRet小于0;反之大于0;顺序不变等于0
break;
case 1://1列
//自己按1列规则排序代码
//...
break;
}
return nRet;
}
发表评论
-
自己写的一段customerDraw
2010-08-24 16:20 1856void CNewReportPage::OnNMCustom ... -
帖BitMap
2010-08-24 09:42 746void CEx_14View::O ... -
clistctrl +号按钮绘制
2010-08-11 17:18 1521网上有关clistctrl举不胜举,包括按钮控件的绘 ... -
listctrl总结2
2010-08-11 17:11 94620. listctrl的subitem添加图标 ... -
VC中使用ListCtrl经验总结(1)
2010-08-11 17:07 1279ListCtrl在工作中,常常用到,也常常看到大家发帖问怎么用 ... -
LV_COLUMN结构体
2010-08-10 14:44 2637typedef struct _LV_COLUMN {UINT ... -
加载位图BITMAP
2010-08-10 14:27 1402m_Bitmap.LoadBitmap(IDB_BITMAP1 ... -
关于控件重绘函数/消息 OnPaint,OnDraw,OnDrawItem,DrawItem的区别
2010-08-10 13:15 6377而OnPaint()是CWnd的类成员,同时负责响应WM_ ... -
listctrl 重绘
2010-08-10 10:15 1013common control 4.7版本介绍 ... -
OnCreate PreCreateWindow PreSubclassWindow
2010-08-09 17:47 1723OnCreate PreCreateWindow PreSub ... -
扩展CListCtrl实现颜色长度改变
2010-08-09 17:34 3164用CListCtrl来显示数据比较方便,有时候我们需要标注某一 ... -
创建CListCtrl中的排序小图标
2010-08-09 17:11 2272创建CListCtrl中的排序小图标 for(int i = ... -
CListCtrl控件的使用
2010-08-09 17:02 1155初始化: DWORD dwStyle; dwStyle = m ... -
改变 CListCtrl、CHeaderCtrl 高度、字体、颜色和背景
2010-08-09 16:49 2566改变 CListCtrl、CHeaderCtrl 高度、字体、 ... -
CHeaderCtrl用法
2010-08-09 15:47 4202CListCtrl的表头可以单独 ... -
树型视的三个结构TVINSERTSTRUCT、TVITEM、NMTREEVIEW
2010-08-05 18:11 953TVINSERTSTRUCT包含添加新项到树形视控件所使用的信 ... -
剪贴板和OLE拖放
2010-08-05 16:35 1084一、传统剪贴板 ... -
文档/视图结构中的各个部分是如何联系到一起的
2010-08-05 15:39 716文档/视图结构是MFC中最有特色而又有难度的部分,在这当中涉及 ... -
MFC一些函数区别
2010-08-05 13:43 1610GetMessagePos GetCursorPos的区别 ... -
LPTSTR、LPCSTR、LPCTSTR、LPSTR的意义
2010-08-05 13:33 987UNICODE:它是用两个字节 ...
相关推荐
该资源主要是讲述使用VS2012 MFC的CListCtrl(列表)控件加载类似于QQ界面的图片与文字数据.主要通过CListCtrl::InsertColumn、InsertItem、SetItemText向列表插入数据,CImageList插入BMP图片或ICON图标.是博客文章...
Clistctrl用法Clistctrl用法Clistctrl用法 Clistctrl用法Clistctrl用法Clistctrl用法
自定义多功能CListCtrl:双击可编辑表格,进度条,按钮(普通按钮、单选按钮、复选按钮),并实现了控制台打印调试信息功能。
CListCtrl的用法CListCtrl的用法CListCtrl的用法CListCtrl的用法CListCtrl的用法CListCtrl的用法CListCtrl的用法CListCtrl的用法CListCtrl的用法CListCtrl的用法
CListCtrl获得列的属性可以使用BOOL CListCtrl::GetColumn( int nCol, LVCOLUMN* pColumn ),nCol为需要获得获得属性值的列序号,pColumn 为 LVCOLUMN 结构体的指针。LVCOLUMN结构体中的 UINT mask 作为输入,决定...
MFC的CListCtl控件的使用方法,用VS2017编译器写的,其他的可能打不开
CListCtrl控件基本用法
CListCtrl控件使用方法总结
MFC,CListCtrl控件的详细使用方法
VC_CListCtrl使用方法,我是在MFC的对话框模式下使用CListCtrl控件的,其实不管在SDK或文档/视图模式下,VC控件的使用都差不多,下面来好好的写写CListCtrl控件的使用笔记。
CListCtrl 代码 CListCtrl 代码 CListCtrl 代码 CListCtrl 代码
CListCtrl超强排序:CListCtrl 排序 列表控件 vc
CListCtrl控件背景颜色网格色彩,用CListCtrl来显示数据比较方便,有时候我们需要标注某一列或某一个单元格的背景和字体颜色,或者需要改变一下行高和字体大小,CListCtrl要改变这些并不是很方便。本文将介绍如何...
CListCtrl::OnNcCalcSize(bCalcValidRects, lpncsp); } WM_CREATE 应用程序创建一个窗口 WM_DESTROY一个窗口被销毁 WM_MOVE 移动一个窗口 WM_SIZE改变一个窗口的大小 WM_ACTIVATE一个窗口被激活或失去激活
通过vs2008调试,所有功能均可直接调用。CListCtrl 打印列表 CListCtrl打印、CListCtrl导出到Excel、列表控件
详细列出了clistctrl的各种属性,并配备了一个重载类,效果很好看。
介绍clistctrl的使用方法以及相关的函数,对于使用clistctrl控件有很好的帮助,可以学习这个方法后,再结合msdn学习
列表控件可以看作是功能增强的ListBox,它提供了四种风格,而且可以同时显示一列的多中属性值,MFC中使用CListCtrl类来封装列表控件的各种操作。
网上大部分ClistCtrl添加ComboBox控件都是在OnEditBegin函数中添加,我写的这个从一开始就一直将CComboBox控件静态显示在CListCtrl之上。将其他控件也可参考这段代码,比较简单易懂!
CListCtrl实例CListCtrl实例CListCtrl实例CListCtrl实例CListCtrl实例