CListCtrl::SortItems() 方法的原型如下:
BOOL SortItems( PFNLVCOMPARE pfnCompare, DWORD dwData );
pfnCompare:指定的是一個回調(diào)函數(shù)的入口地址,這個函數(shù)在列表中的連續(xù)的節(jié)點要進行比較的時候調(diào)用,比如說列表中有三個元素,I1,I2,I3, 現(xiàn)在要對這個三個元素排序,那么I1 跟 I2比較時會調(diào)用這個函數(shù),I2 跟 I3比較時也會調(diào)用(當然,第二次的I2可能已經(jīng)跟I1互換了). 該函數(shù)必須聲明為static類型,或者一個非類成員函數(shù).
dwData: 指定的是列表對象.
回調(diào)函數(shù)的原型如下:
MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
參數(shù)lParam1和lParam2 其實是兩個列表Item的索引值, 排序?qū)嶋H上就是對這個值進行比較.
lParamSort包含了指向TreeCtrl控件的指針,可強制轉(zhuǎn)換過來.
這里需要注意的問題是,在調(diào)用SortItems()方法之前,必須調(diào)用SetItemData( int nItem, DWORD dwData ) 方法來設(shè)置回調(diào)函數(shù)中使用到LPARAM lParam1, LPARAM lParam2
MSDN中對于SetItemData()函數(shù)的解釋如下:
This function sets the 32-bit application-specific value associated with the item specified by nItem. This value is the lParam member of the
LVITEM structure, as described in the Platform SDK.
所以不調(diào)用SetItemData方法,直接去調(diào)用SortItem方法就會出現(xiàn)排序無效的結(jié)果.
//SortItems函數(shù)的回調(diào)函數(shù)
int CALLBACK CConfigDlg::ListCtrlCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
INT iRet = 0;
if (lParam1 > lParam2)
{
iRet = 1;
}
else
{
iRet = -1;
}
return iRet;
}