现在的位置: 首页 > 综合 > 正文

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

2013年09月01日 ⁄ 综合 ⁄ 共 2231字 ⁄ 字号 评论关闭

在头文件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;
}

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

抱歉!评论已关闭.