ListCtrl排序擴展類--CSortListCtrl

1. CSortList是CListCtrl的派生類。函數

2. 要讓CSortList自行排序,固然得讓CSortList本身處理LVN_COLUMNCLICK消息spa

ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnLvnColumnclick)
   OnLvnColumnclick的做用就是設置排序列,排序方式,最後調用SortItems()。code

3. 排序的具體實現,也就是CALLBACK ListCompare(...)的實現:
   基本要求: 讓CSortList根據Item進行排序,而與數據源無關。(固然這樣也有不足之處,就是排序只能按文本排序了。若是你須要按數字排序的話,那就只有特殊處理了。)blog

這裏涉及到的最主要的函數是:
  (1)ListCompare - 實現排序的回調函數
  int CALLBACK CSortList::ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
  (2)CListCtrl::FindItem - 查找相應的Item, 查找方式可指定
  int FindItem( LVFINDINFO* pFindInfo, int nStart = -1 ) const;
  FindItem的具體細節請參考MSDN.
 
  基本思路:
  (1)ListCompare的原型:傳入的參數lParam1,lParam2是相應兩行的ItemData;
  (2)FindItem根據lParam1,lParam2獲得相應的Item;
  FindItem有多種查找方式(查找方式經過LVFINDINFO->flags進行設置),這裏只是根據ItemData進行查找。
  (3)再用GetItemText獲得排序列的ItemText;
  (4)最後就是比較ItemText了。

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

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

CSortListCtrl m_test;
//初始化控件

 DWORD dwStyle =::GetWindowLong(m_test.m_hWnd, GWL_STYLE); 
 dwStyle &=~(LVS_TYPEMASK);

 dwStyle &=~(LVS_EDITLABELS);
//設置新風格

 SetWindowLongW(m_test.m_hWnd, GWL_STYLE, dwStyle|LVS_REPORT|LVS_NOLABELWRAP|LVS_SHOWSELALWAYS);

//設置擴展風格

 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);


相關文章
相關標籤/搜索