`

CListCtrl::SortItems的用法:

    博客分类:
  • MFC
 
阅读更多

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;
}

分享到:
评论

相关推荐

    CListCtrl超强排序

    CListCtrl超强排序 CListCtrl超强排序是指在Visual C++环境下使用CListCtrl类对列表控件进行排序操作。...这个示例程序展示了如何使用CListCtrl类的SortItems方法对列表控件进行排序,并实现了超强排序功能。

    Control-the-use-of-VC-list.rar_list control_vc list_vc list cont

    9. **自定义视图**:更高级的用法是实现自定义视图,这需要派生一个新的类并覆盖OnDrawItem等方法,以绘制自定义的列表项样式。 10. **排序和筛选**:列表控件可以实现数据的动态排序,通过重载LVN_COLUMNCLICK消息...

    clistctrl类中点击的排序功能

    总之,`CListCtrl`的排序功能是通过监听`LVN_COLUMNCLICK`通知,结合自定义的比较函数和`SortItems`方法来实现的。在实现过程中,要注意更新列头的样式以反映排序状态,并考虑多列排序的需求。通过对提供的源代码...

    CListCtrl 例子 代码

    CListCtrl是MFC(Microsoft Foundation Classes)库中一个非常重要的控件,它用于创建具有列表视图的用户界面元素。在Windows应用程序开发中...为了学习和理解CListCtrl的用法,需要打开这些文件查看其内容并编译运行。

    C++的列表控件CLISTCTRL使用方法

    C++中CLISTCTRL控件的使用方法 CLISTCTRL控件是C++中的一种列表控件,主要用于显示一组数据记录供用户进行各种操作。该控件提供了对Windows列表功能操作的基本方法,可以通过调用视成员GetListCtrl获取嵌在列表视内...

    CListCtrl 控件的排序 头部箭头

    5. **实际排序**:使用CListCtrl的SortItems函数对列表进行排序。这个函数需要一个比较函数作为参数,该函数接收两个LPARAM类型的参数,表示列表项的用户数据,并返回一个整数值,表示比较结果。 6. **更新头部箭头...

    CListCtrl.rar_CListCtrl

    在这个"CListCtrl.rar"压缩包中,包含了使用`CListCtrl`进行实际操作的示例代码,对于初学者或者开发者来说,这是一个非常有价值的参考资料。通过这个例子,你可以学习到如何在你的程序中实现以下功能: 1. **初始...

    CListCtrl使用详解及源码实例

    以上就是 CListCtrl 控件的基本使用方法,包括初始化、插入数据、读取数据、复选框处理和排序。通过这些方法,开发者能够构建出功能丰富的列表视图界面,以满足各种界面展示需求。在实际开发中,可以根据具体需求...

    排序类CListCtrl

    `CListCtrl`默认并不支持动态排序,但可以通过继承`CListCtrl`并重写其中的方法来实现这一功能。主要涉及以下几个关键知识点: 1. **重写比较函数**: - 在自定义的排序类中,你需要重写`CompareItem`成员函数。这...

    CListCtrl子项高亮,可编辑

    可以通过重载CListCtrl的SortItems函数或者使用LV_SORTCALLBACK结构来实现。用户可以根据一列或多列的值对子项进行升序或降序排序。 5. **注意事项**: - 要注意处理焦点问题,确保在编辑结束后,焦点正确返回到...

    CListCtrl Demo

    5. **排序与筛选**:CListCtrl支持按列进行排序,通过SetColumnSortIcon()和SortItems()函数实现。同时,可以实现数据的筛选功能,展示符合特定条件的项。 6. **扩展样式**:利用SetExtendedStyle()函数,可以开启...

    CListCtrl使用演示

    这个“CListCtrl使用演示”资源可能包含了上述功能的示例代码,初学者可以通过阅读和运行这些代码,直观地学习CListCtrl的用法。同时,为了深入理解,还需要查阅MFC文档,学习更多关于CListCtrl的高级特性,如虚拟...

    关于CListctrl的详细使用

    虽然CListCtrl本身不提供内置的排序功能,但可以通过重写CompareItem()函数并调用SortItems()来实现自定义排序。过滤功能通常需要应用程序自己实现,可以监听LVN_GETDISPINFO通知,根据条件决定是否显示某项。 10....

    CListCtrl控件的详细使用方法

    本篇将深入探讨CListCtrl控件的详细使用方法,涵盖其基本概念、功能、创建、操作及自定义。 1. **基本概念** CListCtrl是MFC对Windows API中的LISTVIEW控件的封装,它提供了多种视图模式,如报告视图、小图标视图...

    CListCtrl控件使用方法总结

    下面将详细介绍CListCtrl控件的使用方法。 1. **控件风格**: - `LVS_ICON`:每项显示大图标。 - `LVS_SMALLICON`:每项显示小图标。 - `LVS_LIST`:显示一列带有小图标的项目。 - `LVS_REPORT`:显示项目的...

    可以自动排序的CListCtrl

    首先,我们要理解`CListCtrl`的基本用法。`CListCtrl`是MFC中的一个类,它封装了Windows API中的`LVITEM`结构和`ListView`控件。我们可以通过添加、删除、修改条目以及设置不同的视图模式来操作这个控件。 自动排序...

    clistctrl 排序实现

    6. **实现`CSortListCtrlEx`类**:为了更好地封装这个功能,你可以创建一个继承自`CListCtrl`的自定义类,比如`CSortListCtrlEx`,并在这个类中添加排序的方法和成员变量。 下面是一个简单的`CSortListCtrlEx`类...

    CListCtrl的用法

    本篇文章将详细探讨CListCtrl的用法,包括其基本概念、功能、属性、方法以及如何在实际项目中应用。 一、CListCtrl基础 1. 创建CListCtrl对象:在MFC应用程序中,首先需要在对话框或视图类中声明一个CListCtrl成员...

    clistctrl的应用

    同时,为了提供更丰富的用户体验,我们还可以实现排序和过滤功能,通过LVSCW_AUTOSIZE_USEHEADER自动调整列宽,或者使用SortItems函数对列表进行排序。 总之,“CListCtrl的应用”涵盖了Windows编程中的一个重要...

    mfc clistctrl

    4. **图像列表**:`CListCtrl`支持图像列表,你可以使用`SetImageList`方法设置图像列表,为项提供图标或状态图。 5. **选中和高亮**:`SetItemState`方法用于改变项的状态,例如选择或高亮。 6. **事件处理**:...

Global site tag (gtag.js) - Google Analytics