首先,你要有一个list Control控件
一:然后定义全局变量:
DWORD dwSelCol = 0; // 记录点击的列
BOOL bASC = FALSE; // 记录比较方法 默认为声升序
二:添加比较函数:
比较函数是一个回调函数,里面是排序方法的实现。
首先在你的头文件中声明:
static int CALLBACK MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAMlParamSort)
然后在cpp文件中实现:
int CALLBACK CListTestDlg::MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CListCtrl* pListCtrl = (CListCtrl*) lParamSort;
LVFINDINFO findInfo;
findInfo.flags = LVFI_PARAM;
findInfo.lParam = lParam1;
int iItem1 = pListCtrl->FindItem(&findInfo,-1);
findInfo.lParam = lParam2;
int iItem2 = pListCtrl->FindItem(&findInfo,-1);
CString strItem1 = pListCtrl->GetItemText(iItem1 ,dwSelCol);
CString strItem2 = pListCtrl->GetItemText(iItem2 ,dwSelCol);
if (bAsc)
{
return strcmp(strItem2, strItem1);
}
else
{
return strcmp(strItem1, strItem2);
}
}
这里值得注意的是声明是static函数,但是在实现时记得不要带static,还有记得带上你类的作用域(CListTestDlg是我的Dlg类)
三:表头点击相应函数:
//函数功能:响应点击列表框上的表头动作,对列表中的数据进行排序
void CListTestDlg::OnColumnclickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
if(dwSelCol != pNMListView->iSubItem){
dwSelCol = pNMListView->iSubItem;
bASC = bASC;
}
else{
bASC = !bASC;
}
int count = m_list01.GetItemCount(); //行数
for(int i=0; i<count; i++)
m_list01.SetItemData(i,i);
m_list01.SortItems(MyCompareProc, (LPARAM) &m_list01);
*pResult = 0;
}