- 浏览: 73757 次
- 性别:
- 来自: 上海
文章分类
最新评论
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 1897void CNewReportPage::OnNMCustom ... -
帖BitMap
2010-08-24 09:42 793void CEx_14View::O ... -
clistctrl +号按钮绘制
2010-08-11 17:18 1588网上有关clistctrl举不胜举,包括按钮控件的绘 ... -
listctrl总结2
2010-08-11 17:11 99420. listctrl的subitem添加图标 ... -
VC中使用ListCtrl经验总结(1)
2010-08-11 17:07 1334ListCtrl在工作中,常常用到,也常常看到大家发帖问怎么用 ... -
LV_COLUMN结构体
2010-08-10 14:44 2719typedef struct _LV_COLUMN {UINT ... -
加载位图BITMAP
2010-08-10 14:27 1458m_Bitmap.LoadBitmap(IDB_BITMAP1 ... -
关于控件重绘函数/消息 OnPaint,OnDraw,OnDrawItem,DrawItem的区别
2010-08-10 13:15 6459而OnPaint()是CWnd的类成员,同时负责响应WM_ ... -
listctrl 重绘
2010-08-10 10:15 1060common control 4.7版本介绍 ... -
OnCreate PreCreateWindow PreSubclassWindow
2010-08-09 17:47 1782OnCreate PreCreateWindow PreSub ... -
扩展CListCtrl实现颜色长度改变
2010-08-09 17:34 3231用CListCtrl来显示数据比较方便,有时候我们需要标注某一 ... -
创建CListCtrl中的排序小图标
2010-08-09 17:11 2325创建CListCtrl中的排序小图标 for(int i = ... -
CListCtrl控件的使用
2010-08-09 17:02 1205初始化: DWORD dwStyle; dwStyle = m ... -
改变 CListCtrl、CHeaderCtrl 高度、字体、颜色和背景
2010-08-09 16:49 2695改变 CListCtrl、CHeaderCtrl 高度、字体、 ... -
CHeaderCtrl用法
2010-08-09 15:47 4263CListCtrl的表头可以单独 ... -
树型视的三个结构TVINSERTSTRUCT、TVITEM、NMTREEVIEW
2010-08-05 18:11 996TVINSERTSTRUCT包含添加新项到树形视控件所使用的信 ... -
剪贴板和OLE拖放
2010-08-05 16:35 1164一、传统剪贴板 ... -
文档/视图结构中的各个部分是如何联系到一起的
2010-08-05 15:39 765文档/视图结构是MFC中最有特色而又有难度的部分,在这当中涉及 ... -
MFC一些函数区别
2010-08-05 13:43 1678GetMessagePos GetCursorPos的区别 ... -
LPTSTR、LPCSTR、LPCTSTR、LPSTR的意义
2010-08-05 13:33 1048UNICODE:它是用两个字节 ...
相关推荐
CListCtrl超强排序 CListCtrl超强排序是指在Visual C++环境下使用CListCtrl类对列表控件进行排序操作。...这个示例程序展示了如何使用CListCtrl类的SortItems方法对列表控件进行排序,并实现了超强排序功能。
9. **自定义视图**:更高级的用法是实现自定义视图,这需要派生一个新的类并覆盖OnDrawItem等方法,以绘制自定义的列表项样式。 10. **排序和筛选**:列表控件可以实现数据的动态排序,通过重载LVN_COLUMNCLICK消息...
总之,`CListCtrl`的排序功能是通过监听`LVN_COLUMNCLICK`通知,结合自定义的比较函数和`SortItems`方法来实现的。在实现过程中,要注意更新列头的样式以反映排序状态,并考虑多列排序的需求。通过对提供的源代码...
CListCtrl是MFC(Microsoft Foundation Classes)库中一个非常重要的控件,它用于创建具有列表视图的用户界面元素。在Windows应用程序开发中...为了学习和理解CListCtrl的用法,需要打开这些文件查看其内容并编译运行。
C++中CLISTCTRL控件的使用方法 CLISTCTRL控件是C++中的一种列表控件,主要用于显示一组数据记录供用户进行各种操作。该控件提供了对Windows列表功能操作的基本方法,可以通过调用视成员GetListCtrl获取嵌在列表视内...
5. **实际排序**:使用CListCtrl的SortItems函数对列表进行排序。这个函数需要一个比较函数作为参数,该函数接收两个LPARAM类型的参数,表示列表项的用户数据,并返回一个整数值,表示比较结果。 6. **更新头部箭头...
在这个"CListCtrl.rar"压缩包中,包含了使用`CListCtrl`进行实际操作的示例代码,对于初学者或者开发者来说,这是一个非常有价值的参考资料。通过这个例子,你可以学习到如何在你的程序中实现以下功能: 1. **初始...
以上就是 CListCtrl 控件的基本使用方法,包括初始化、插入数据、读取数据、复选框处理和排序。通过这些方法,开发者能够构建出功能丰富的列表视图界面,以满足各种界面展示需求。在实际开发中,可以根据具体需求...
`CListCtrl`默认并不支持动态排序,但可以通过继承`CListCtrl`并重写其中的方法来实现这一功能。主要涉及以下几个关键知识点: 1. **重写比较函数**: - 在自定义的排序类中,你需要重写`CompareItem`成员函数。这...
可以通过重载CListCtrl的SortItems函数或者使用LV_SORTCALLBACK结构来实现。用户可以根据一列或多列的值对子项进行升序或降序排序。 5. **注意事项**: - 要注意处理焦点问题,确保在编辑结束后,焦点正确返回到...
5. **排序与筛选**:CListCtrl支持按列进行排序,通过SetColumnSortIcon()和SortItems()函数实现。同时,可以实现数据的筛选功能,展示符合特定条件的项。 6. **扩展样式**:利用SetExtendedStyle()函数,可以开启...
这个“CListCtrl使用演示”资源可能包含了上述功能的示例代码,初学者可以通过阅读和运行这些代码,直观地学习CListCtrl的用法。同时,为了深入理解,还需要查阅MFC文档,学习更多关于CListCtrl的高级特性,如虚拟...
虽然CListCtrl本身不提供内置的排序功能,但可以通过重写CompareItem()函数并调用SortItems()来实现自定义排序。过滤功能通常需要应用程序自己实现,可以监听LVN_GETDISPINFO通知,根据条件决定是否显示某项。 10....
本篇将深入探讨CListCtrl控件的详细使用方法,涵盖其基本概念、功能、创建、操作及自定义。 1. **基本概念** CListCtrl是MFC对Windows API中的LISTVIEW控件的封装,它提供了多种视图模式,如报告视图、小图标视图...
下面将详细介绍CListCtrl控件的使用方法。 1. **控件风格**: - `LVS_ICON`:每项显示大图标。 - `LVS_SMALLICON`:每项显示小图标。 - `LVS_LIST`:显示一列带有小图标的项目。 - `LVS_REPORT`:显示项目的...
首先,我们要理解`CListCtrl`的基本用法。`CListCtrl`是MFC中的一个类,它封装了Windows API中的`LVITEM`结构和`ListView`控件。我们可以通过添加、删除、修改条目以及设置不同的视图模式来操作这个控件。 自动排序...
6. **实现`CSortListCtrlEx`类**:为了更好地封装这个功能,你可以创建一个继承自`CListCtrl`的自定义类,比如`CSortListCtrlEx`,并在这个类中添加排序的方法和成员变量。 下面是一个简单的`CSortListCtrlEx`类...
本篇文章将详细探讨CListCtrl的用法,包括其基本概念、功能、属性、方法以及如何在实际项目中应用。 一、CListCtrl基础 1. 创建CListCtrl对象:在MFC应用程序中,首先需要在对话框或视图类中声明一个CListCtrl成员...
同时,为了提供更丰富的用户体验,我们还可以实现排序和过滤功能,通过LVSCW_AUTOSIZE_USEHEADER自动调整列宽,或者使用SortItems函数对列表进行排序。 总之,“CListCtrl的应用”涵盖了Windows编程中的一个重要...
4. **图像列表**:`CListCtrl`支持图像列表,你可以使用`SetImageList`方法设置图像列表,为项提供图标或状态图。 5. **选中和高亮**:`SetItemState`方法用于改变项的状态,例如选择或高亮。 6. **事件处理**:...