1. CSortList是CListCtrl的派生類。
2. 要讓CSortList自行排序,當(dāng)然得讓CSortList自己處理LVN_COLUMNCLICK消息
ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnLvnColumnclick)
OnLvnColumnclick的作用就是設(shè)置排序列,排序方式,最后調(diào)用SortItems()。
3. 排序的具體實(shí)現(xiàn),也就是CALLBACK ListCompare(...)的實(shí)現(xiàn):
基本要求: 讓CSortList根據(jù)Item進(jìn)行排序,而與數(shù)據(jù)源無(wú)關(guān)。(當(dāng)然這樣也有不足之處,就是排序只能按文本排序了。如果你需要按數(shù)字排序的話,那就只有特殊處理了。)
這里涉及到的最主要的函數(shù)是:
(1)ListCompare - 實(shí)現(xiàn)排序的回調(diào)函數(shù)
int CALLBACK CSortList::ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
(2)CListCtrl::FindItem - 查找相應(yīng)的Item, 查找方式可指定
int FindItem( LVFINDINFO* pFindInfo, int nStart = -1 ) const;
FindItem的具體細(xì)節(jié)請(qǐng)參考MSDN.
基本思路:
(1)ListCompare的原型:傳入的參數(shù)lParam1,lParam2是相應(yīng)兩行的ItemData;
(2)FindItem根據(jù)lParam1,lParam2得到相應(yīng)的Item;
FindItem有多種查找方式(查找方式通過(guò)LVFINDINFO->flags進(jìn)行設(shè)置),這里只是根據(jù)ItemData進(jìn)行查找。
(3)再用GetItemText得到排序列的ItemText;
(4)最后就是比較ItemText了。
下面是源代碼:
只有兩個(gè)文件:CSortListCtrl.H, CSortListCtrl.cpp
直接把這兩個(gè)文件放到項(xiàng)目里就可以了。
/Files/amazon/CSortListCtrl.rar
在對(duì)話框程序C***Dlg中,可添加如下初始化信息,設(shè)置控件的風(fēng)格和擴(kuò)展風(fēng)格。注意要根據(jù)HDITEM類型變量和CHeaderCtrl::SetItem函數(shù)設(shè)置列的類型屬性。



















































































































































多謝分析