VC++中ClistControl列表头实现排序

本文介绍如何使用CListCtrl控件并实现其列点击排序功能。通过定义结构体及回调函数CompareFuncs来定制列表项的比较逻辑,利用SetItemData方法为列表项设置排序数据,并在OnLvnColumnclickListHistory事件中调用SortItems方法完成排序。

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

在头文件XXX.h的类申明前先定义以下内容:

struct MyData
{
     CListCtrl *listctrl;   //申明对象           
     int isub;   
     int seq;   //决定是升序还是降序
};

//回调函数

inline int CALLBACK CompareFuncs(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);
 //char* item1 = (char *)(LPCTSTR)strItem1;
 //char* item2 = (char *)(LPCTSTR)strItem2; 
 if(p->seq)
  //return strcmp(item1,item2);//网上说用strcmp这个方法,它是char类型比较,所以Cstring用compare这个方法
  return strItem1.Compare(strItem2);
 else
  //return strcmp(item2,item1);
  return strItem2.Compare(strItem1);
};

/////////////回调函数基本不用自己写的,直接拷贝就好了////////////////////////////////

接下来就要对控件进行实例化了

我在XXX.h中直接申请了

public:
 CListCtrl    m_List_history;

对控件要实例化时:

m_List_history.InsertColumn(0,L"任务"); 
 m_List_history.InsertColumn(1,L"标题");
 m_List_history.InsertColumn(2,L"状态");
 m_List_history.InsertColumn(3,L"时间");
 m_List_history.SetColumnWidth(0,30);////减少20
 m_List_history.SetColumnWidth(1,57);////
 m_List_history.SetColumnWidth(2,48);///
 m_List_history.SetColumnWidth(3,160);///

这个是我的项目的代码,自己可以根据自己的工程来实例化你自己的控件(具体的实例化对象的方法,网上多的是,随便就可以找到了)

在实例化了你的控件的时候,记得用这个方法:m_List_history.SetItemData(iItem,i);//去实现排序

最后就是在控件的事件里找到OnLvnColumnclickListHistory这个事件(点击控件的列时发生)

void CHistoryPage::OnLvnColumnclickListHistory(NMHDR *pNMHDR, LRESULT *pResult)
{
 LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
 // TODO: 在此添加控件通知处理程序代码
 //if(pNMLV->iSubItem == m_nSortedCol1)
 MyData *tmpp=new MyData;
 //tmpp->listctrl=&m_list;
 tmpp->listctrl=&m_List_history;
 tmpp->isub=pNMLV->iSubItem;
 int sortnum=(int)GetProp(m_List_history.GetSafeHwnd(),L"SORT_COLUMN");
 int sortasc=(int)GetProp(m_List_history.GetSafeHwnd(),L"SORT_DIRECTION");
 if(sortnum==pNMLV->iSubItem){
  sortasc=(sortasc+1)%2;
  SetProp(m_List_history.GetSafeHwnd(),L"SORT_DIRECTION",(HANDLE)sortasc);
 }
 SetProp(m_List_history.GetSafeHwnd(),L"SORT_COLUMN",(HANDLE)pNMLV->iSubItem);
 tmpp->seq=sortasc;
 m_List_history.SortItems(&CompareFuncs,(LPARAM)tmpp);
 *pResult = 0;
}

自己可以参照自己的工程去修改代码,这样就实现了控件的点击列进行排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值