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