1. 排序函數(shù)。
排序主要依靠的是SortItems(CompareProc , (LPARAM)this)函數(shù),因此需要一個排序的靜態(tài)函數(shù)CompareProc 作為參數(shù),在CompareProc 函數(shù)中,獲得ItemText的操作不可以使用簡單的GetItemText(lParam1,szItemText)函數(shù),因為在排序操作中l(wèi)Param1不是靜態(tài)的Index(由于排序過程中Index在不斷變化)。所以需要在每個Item中先使用SetItemData保存Index,這樣的Index才是靜態(tài)的。在排序時,這樣操作:
1
int CListInfo::CompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
2

{
3
// lParamSort contains a pointer to the list view control.
4
// The lParam of an item is just its index.
5
CString strFir , strSec;
6
int cmp = 0;
7
CListInfo* pListInfo = (CListInfo*) lParamSort;
8
9
LVFINDINFO info;
10
int nIndex;
11
info.flags = LVFI_PARAM; //set LVFI_PARAM to info
12
info.lParam = lParam1; //get the item text item data(lParam1)
13
if ( (nIndex=pListInfo->FindItem(&info)) != -1)
14
strFir = pListInfo->GetItemText(nIndex, pListInfo->m_nSortCol);
15
info.lParam = lParam2; //get the item text item data(lParam2)
16
if ( (nIndex=pListInfo->FindItem(&info)) != -1)
17
strSec = pListInfo->GetItemText(nIndex, pListInfo->m_nSortCol);
18
19
cmp = strFir.CompareNoCase(strSec);
20
21
return pListInfo->m_bAscending ? cmp : -cmp;
22
}
這里使用了FindItem來獲得Item的靜態(tài)Index。
2. 使用表示上下的小圖標(biāo)來表示排序順序。
首先需要給表頭欄添加小圖標(biāo):
CImageList m_ImageList;
m_ImageList.Create(IDB_SORT , 16 , 1 , RGB(255 , 255 , 255));
GetHeaderCtrl()->SetImageList(&m_ImageList);
點擊了表頭欄后,需要按照排序順序來選擇貼圖:
1
HDITEM hdi;
2
CHeaderCtrl* pHdrCtrl = GetHeaderCtrl();
3
int nCount = pHdrCtrl->GetItemCount();
4
5
for (int nItem = 0; nItem < nCount; nItem++)
6

{
7
pHdrCtrl->GetItem(nItem, &hdi);
8
9
if (nItem == m_nSortCol)
10
{
11
hdi.mask= HDI_IMAGE | HDI_FORMAT;
12
13
hdi.iImage = m_bAscending ? 0 : 1;
14
hdi.fmt = HDF_LEFT | HDF_STRING |HDF_IMAGE | HDF_BITMAP_ON_RIGHT;
15
}
16
else
17
{
18
hdi.mask= HDI_FORMAT;
19
20
hdi.fmt = HDF_LEFT | HDF_STRING;
21
}
22
23
pHdrCtrl->SetItem(nItem, &hdi);
24
}
通過HDITEM的iImage參數(shù)即可決定選擇第幾個圖片(圖片的順序按照m_ImageList.Create(IDB_SORT , 16 , 1 , RGB(255 , 255 , 255));
中的16像素點來決定)。