1. CSortList是CListCtrl的派生類。

2. 要讓CSortList自行排序,當然得讓CSortList自己處理LVN_COLUMNCLICK消息

    ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnLvnColumnclick)
    OnLvnColumnclick的作用就是設(shè)置排序列,排序方式,最后調(diào)用SortItems()。

3. 排序的具體實現(xiàn),也就是CALLBACK ListCompare(...)的實現(xiàn):
    基本要求: 讓CSortList根據(jù)Item進行排序,而與數(shù)據(jù)源無關(guān)。(當然這樣也有不足之處,就是排序只能按文本排序了。如果你需要按數(shù)字排序的話,那就只有特殊處理了。)

   這里涉及到的最主要的函數(shù)是:
   (1)ListCompare - 實現(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的具體細節(jié)請參考MSDN.
  
   基本思路:
   (1)ListCompare的原型:傳入的參數(shù)lParam1,lParam2是相應(yīng)兩行的ItemData;
   (2)FindItem根據(jù)lParam1,lParam2得到相應(yīng)的Item;
   FindItem有多種查找方式(查找方式通過LVFINDINFO->flags進行設(shè)置),這里只是根據(jù)ItemData進行查找。
   (3)再用GetItemText得到排序列的ItemText;
   (4)最后就是比較ItemText了。

下面是源代碼:
只有兩個文件:CSortListCtrl.H, CSortListCtrl.cpp
直接把這兩個文件放到項目里就可以了。
/Files/amazon/CSortListCtrl.rar

在對話框程序C***Dlg中,可添加如下初始化信息,設(shè)置控件的風格和擴展風格。注意要根據(jù)HDITEM類型變量和CHeaderCtrl::SetItem函數(shù)設(shè)置列的類型屬性。

CSortListCtrl m_test;

//初始化控件
 DWORD dwStyle = ::GetWindowLong(m_test.m_hWnd, GWL_STYLE); 
 dwStyle 
&= ~(LVS_TYPEMASK);
 dwStyle 
&= ~(LVS_EDITLABELS);
 
//設(shè)置新風格
 SetWindowLongW(m_test.m_hWnd, GWL_STYLE, dwStyle|LVS_REPORT|LVS_NOLABELWRAP|LVS_SHOWSELALWAYS);
 
//設(shè)置擴展風格
 DWORD styles = LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES;
 ListView_SetExtendedListViewStyleEx(m_test.m_hWnd, styles, styles);
 m_test.SetExtendedStyle(m_test.GetExtendedStyle() 
| LVS_EX_SUBITEMIMAGES);

 HDITEM headerItem;
 headerItem.mask 
= HDI_LPARAM;
 CHeaderCtrl
* pHeaderCtrl = m_test.GetHeaderCtrl( );

 m_test.InsertColumn(
0, _T("歌曲"), LVCFMT_LEFT, 150);
 .
..

 headerItem.lParam 
= CSortListCtrl::DATA_TYPE::STRING_TYPE;
 pHeaderCtrl
->SetItem(0&headerItem);
 .
..