您的位置:首页 > 编程语言 > C语言/C++

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

2009-10-21 09:54 399 查看
在头文件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;
}

自己可以参照自己的工程去修改代码,这样就实现了控件的点击列进行排序
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: