CListCtrl::SortItems() 方法的原型如下:
BOOL SortItems( PFNLVCOMPARE pfnCompare, DWORD dwData );
pfnCompare:指定的是一個回調函數(shù)的入口地址,這個函數(shù)在列表中的連續(xù)的節(jié)點要進行比較的時候調用,比如說列表中有三個元素,I1,I2,I3, 現(xiàn)在要對這個三個元素排序,那么I1 跟 I2比較時會調用這個函數(shù),I2 跟 I3比較時也會調用(當然,第二次的I2可能已經(jīng)跟I1互換了). 該函數(shù)必須聲明為static類型,或者一個非類成員函數(shù).
dwData: 指定的是列表對象.
回調函數(shù)的原型如下:
MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
參數(shù)lParam1和lParam2 其實是兩個列表Item的索引值, 排序實際上就是對這個值進行比較.
lParamSort包含了指向TreeCtrl控件的指針,可強制轉換過來.
這里需要注意的問題是,在調用SortItems()方法之前,必須調用SetItemData( int nItem, DWORD dwData ) 方法來設置回調函數(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.
所以不調用SetItemData方法,直接去調用SortItem方法就會出現(xiàn)排序無效的結果.
//SortItems函數(shù)的回調函數(shù)
int CALLBACK CConfigDlg::ListCtrlCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
INT iRet = 0;
if (lParam1 > lParam2)
{
iRet = 1;
}
else
{
iRet = -1;
}
return iRet;
}