CListCtrl排序的解决办法

本文介绍了一种使用CListCtrl实现列表排序的方法。通过自定义比较函数并利用ListCtrl的SortItems方法,实现了对列表项的升序和降序排列。文章提供了完整的代码示例,包括初始化ListCtrl、设置列头及数据、响应列点击事件等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这两天写了一个程序,用到了CListCtrl,现把自己总结的排序的方法叙述一下。

首先建立一个formview的单文档exe工程,名为SortA

然后, 在dialog中添加一个 clistctrl控件,改成report

添加该控件的影射变量为:m_list

然后在 sortAview.h的类定义前面添加如下代码:

 

struct MyData {
     CListCtrl 
*listctrl;                 //CListCtrl控件指针

     int isub;        //l列号
     int seq;        //1为升序,0为降序
}
;

//次函数为非常重要函数。

int  CALLBACK CompareFunc(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort)
{
     MyData 
*p=(MyData *
)lParamSort;
     CListCtrl
* list =p->
listctrl;
     
int isub=p->
isub;
     LVFINDINFO findInfo; 
     findInfo.flags 
=
 LVFI_PARAM; 
     findInfo.lParam 
=
 lParam1; 
     
int iItem1 = list->FindItem(&findInfo, -1
); 
     findInfo.lParam 
=
 lParam2; 
     
int iItem2 = list->FindItem(&findInfo, -1
); 
     CString strItem1 
=list->
GetItemText(iItem1,isub); 
     CString strItem2 
=list->
GetItemText(iItem2,isub);
     
if(p->
seq)
          
return
 strcmp(strItem2, strItem1);
     
else

          
return -strcmp(strItem2, strItem1);
}

 

然后,在CSortAView类的 OnInitialUpdate 中添加:

 

    SetProp(m_list.GetSafeHwnd(),"SORT_COLUMN",(HANDLE)0 );
    SetProp(m_list.GetSafeHwnd(),
"SORT_DIRECTION",(HANDLE)1
);
    
//为listctrl添加列头

    m_list.SetExtendedStyle(LVS_EX_GRIDLINES| LVS_EX_FULLROWSELECT);
      m_list.InsertColumn(
0,"姓名",LVCFMT_LEFT,100
);
      m_list.InsertColumn(
1,"年龄",LVCFMT_LEFT,100
);
    m_list.InsertColumn(
2,"妻子的数目",LVCFMT_LEFT,100
);
   
//为listctrl添加三个item

    m_list.InsertItem(0,"陈水扁",0 );    
    m_list.SetItemText(
0,1,"66"
);         
    m_list.SetItemText(
0,2,"67"
);    

    m_list.InsertItem(
1,"游西堃",0
);    
    m_list.SetItemText(
1,1,"85"
);          
    m_list.SetItemText(
1,2,"56"
);    
     
    m_list.InsertItem(
2,"布什",0
);
    m_list.SetItemText(
2,1,"77"
);          
    m_list.SetItemText(
2,2,"26"
);
    
    
//
下面是为每一个item设置一个 itemdata
    
//如果要用sortItems排序,这个是必须的。但是他的值不会影响到排序

    m_list.SetItemData(0,(DWORD)"垃圾" );     
    m_list.SetItemData(
1,(DWORD)"白痴"
); 
    m_list.SetItemData(
2,(DWORD)"傻叉"); 

 

然后,CListCtrl控件的 LVN_COLUMNCLICK 消息影射,并添加代码如下:

 

void CSortAView::OnColumnclickList1(NMHDR* pNMHDR, LRESULT*  pResult) 
{
     NM_LISTVIEW
* pNMListView = (NM_LISTVIEW*
)pNMHDR;
     
// TODO: Add your control notification handler code here

      MyData *tmpp=new MyData;
     tmpp
->listctrl=&
m_list;
     tmpp
->isub=pNMListView->
iSubItem;
     
int sortnum=(int)GetProp(m_list.GetSafeHwnd(),"SORT_COLUMN"
);
     
int sortasc=(int)GetProp(m_list.GetSafeHwnd(),"SORT_DIRECTION"
);
     
if(sortnum==pNMListView->iSubItem)
{
        sortasc
=(sortasc+1)%2
;
        SetProp(m_list.GetSafeHwnd(),
"SORT_DIRECTION"
,(HANDLE)sortasc);
     }

     SetProp(m_list.GetSafeHwnd(),
"SORT_COLUMN",(HANDLE)pNMListView->iSubItem);
     tmpp
->seq=
sortasc;
     m_list.SortItems(CompareFunc,(LPARAM)tmpp);




     
*pResult = 0
;
}

 

经过上面的努力,整个程序就完成了。您可以看到如下的界面:

 

这个只不过是最初级简单的方法。如果感兴趣可以看一看一些复杂的,样式更加多样的排序的例子:

http://www.vckbase.com/document/viewdoc/?id=243

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值