点击表头排序整体的思路都是去 CListCtrl类中的方法SortItems去实现

CListCtrl::SortItems的原型是:

BOOL SortItems( PFNLVCOMPARE pfnCompare, DWORD dwData );

第一个参数pfnCompare为回调函数,形式为:
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);

lParam1,lParam2是什么?这是SortItems难理解的原因。

简单的说:是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 );
    }

第二个参数dwData为用户自定义值。
dwData实际传入的是列数,等于1)中的lParamSort。

void CUpListCtrl::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult) 
{
        NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

        //排序
        //CompareFunc是回调函数
        //pNMListView->iSubItem就是列数

   SortItems( (PFNLVCOMPARE)CompareFunc, pNMListView->iSubItem );

        *pResult = 0;
}

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

  我会在下两篇讲解如何去实现排序

CList 点击表头排序 (2)两种排序方法中其中一种

CList 点击表头排序 (3)两种排序的第二种

CList 点击表头排序 (1)SortItems函数的更多相关文章

  1. CList 点击表头排序 (3)两种排序的第二种

    在头两篇中介绍了CListCtrl::SortItems() 方法的使用和其中的一个排序方法,这篇介绍另一种方法 CList 点击表头排序 (1)SortItems函数 CList 点击表头排序 (2 ...

  2. CList 点击表头排序 (2)两种排序方法中其中一种

    上一篇讲解SortItem()方法如何使用,虽然都是抄别人的但是就是想让大家有个大概的了解 CList 点击表头排序 (1)SortItems函数 点击表头排序基本思路都是 1.首先响应HDN_ITE ...

  3. DBGridEh 点击表头排序方法

    方法1: (不用编程写代码) 程序中引用 单元 EhLibCDS设置DBGridEh的属性:      ColumnDefValues.Title.TitleButton = True      Op ...

  4. swing jTable排序问题(点击表头排序)

    1.JDK6自带排序实现: tableName.setAutoCreateRowSorter(true); 2.其实界面设计中勾选一个属性就搞定了: .

  5. QT中Qtableview视图表格中点击表头进行排序

    用QT写了一个小工具,主要是对Excel中大量的数据进行计算和显示. 写了有一段时间,然后断断续续的做一些修改和完善. 因为要显示的数据有多列,很自然的会想到要能够对显示的数据进行排序.如果直接操作m ...

  6. javascript: 带分组数据的Table表头排序

    如下图: 要求:点击表头排序时,"分组"及"分组明细"的数据层次关系不变 从网上找了一段常规的table排序,改了改,以满足“分组支持”,贴在这里备份 < ...

  7. ElementUI - Table 表头排序

    ElementUI - Table 表头自带排序功能,和排序事件,但是目前只是对当前界面的数据进行排序. 项目需求: 点击表头排序的时候,对所有数据进行排序. 初步方案: 在点击排序按钮的时,在排序事 ...

  8. js 实现table表格拖拽和点击表头升降序排序

    js 实现table表格拖拽和点击表头升降序排序,写的比较乱,用的时候可以把其中的一些模块函数提取出来 样式,由于是可拖拽表格,所以样式 table tr th{cursor:move;} js实现 ...

  9. 非常强大的table根据表头排序,点击表头名称,对其内容排序

    js代码: /** * 通过表头对表列进行排序 * * @param sTableID * 要处理的表ID<table id=''> * @param iCol * 字段列id eg: 0 ...

随机推荐

  1. Ubuntu 16.04/18.04 LTS改变时区和语言

    Ubuntu 16.04/18.04 LTS改变Timezone时区设定原文 https://www.phpini.com/linux/ubuntu-16-04-change-timezone-set ...

  2. modSecurity规则学习(七)——防止SQL注入

    1.数字型SQL注入 /opt/waf/owasp-modsecurity-crs/rules/REQUEST-942-APPLICATION-ATTACK-SQLI.conf"] [lin ...

  3. 插入css样式表的三种方法

    http://www.w3school.com.cn/css/css_howto.asp http://www.runoob.com/css/css-howto.html 当读到一个样式表时,浏览器会 ...

  4. Linux安全应用之防垃圾邮件服务器的构建

    Linux安全应用之防垃圾邮件服务器的构建 一.垃圾邮件产生的原因 垃圾邮件(SPAM) 也称作UCE(Unsoticited Commercial Email.未经许可的商业电子邮件)或UBE(Un ...

  5. Google Nexus 5x Android 7.0 Root

    很久没有写东西了,准备重新养成这个好习惯.因为自己一直在用Nexus,前段时间自己的Nexus5老的不行了,所以买了台5x,一直没时间root,今天有时间终于有时间弄一下. 在这里整理分享一下. 开始 ...

  6. Multi-process Resource Loading

    For Developers‎ > ‎Design Documents‎ > ‎ Multi-process Resource Loading 目录 1 This design doc n ...

  7. Ubuntu18.04上使用LLDB调试Chromium Android C++代码。

    ###动机###Chromium Android源代码庞大且复杂.在调试器LLDB下能帮助我们更好的理解代码流程.介绍使用LLDB调试器调试android上chromium的C++代码. [1] 编译 ...

  8. GHO文件内IE主页的修改方法

    修改方法: 1.先打开映像  GHOSTexp 打开GHO文件 2.提取注册表文件  C:\WINDOWS\SYSTEM32\CONFIG 下就是系统的注册表文件,详细见下 3.打开本地的注册表,加载 ...

  9. 再次学习 Iterator 迭代器 与 Generator 生成器

    Iterator : 返回的结果是:{value, done} function chef(foods){ let i = 0; return { next(){ let done = ( i> ...

  10. 【RHEL7/CentOS7网络配置】

    目录 网卡配置文件 查网卡信息 测试网络是否正常 使用 nmtui 命令配置网络 使用 nm-connection-editor 工具配置网络 修改回6.x版本的网卡名 Rhel/CentOS网络配置 ...