以下给出的一个CSortClass类为:
//CSortClass.h class CSortClass virtual ~CSortClass(); CSortClass(CListCtrl* _pWnd,const int _iCol,const public: static int CALLBACK CompareAsc(LPARAM static int CALLBACK CompareDes(LPARAM static int CALLBACK CompareAscI(LPARAM static int CALLBACK CompareDesI(LPARAM public: CSortItem(const DWORD _dw,const CString& _txt); class CSortItemInt int iInt; DWORD dw; #endif //~_CSORTCLASS_H_ | #include "SortClass.h" CSortClass::CSortClass(CListCtrl* _pWnd,const int _iCol,const bool _bIsNumeric) pWnd = _pWnd; bIsNumeric = _bIsNumeric; ASSERT(pWnd); int max = pWnd->GetItemCount(); DWORD dw; CString txt; if (bIsNumeric) txt = pWnd->GetItemText(t,iCol); pWnd->SetItemData(t,(DWORD) new CSortItemInt(dw,txt)); txt = pWnd->GetItemText(t,iCol); pWnd->SetItemData(t,(DWORD) new CSortItem(dw,txt)); CSortClass::~CSortClass() int max = pWnd->GetItemCount(); for (int t = 0; t < max; t++) delete pItem; for (int t = 0; t < max; t++) delete pItem; void CSortClass::Sort(const bool bAsc) int CALLBACK CSortClass::CompareAsc(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort) CSortItem* i2 = (CSortItem*)lParam2; return i1->txt.CompareNoCase(i2->txt); int CALLBACK CSortClass::CompareDes(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort) CSortItem* i2 = (CSortItem*)lParam2; return i2->txt.CompareNoCase(i1->txt); int CALLBACK CSortClass::CompareAscI(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort) CSortItemInt* i2 = (CSortItemInt*)lParam2; if (i1->iInt == i2->iInt) int CALLBACK CSortClass::CompareDesI(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort) CSortItemInt* i2 = (CSortItemInt*)lParam2; if (i1->iInt == i2->iInt) CSortClass::CSortItem::CSortItem(const DWORD _dw,const CString& _txt) CSortClass::CSortItem::~CSortItem() } CSortClass::CSortItemInt::CSortItemInt(const DWORD _dw,CString _txt) dw = _dw; |
在使用时候要注意3点:
1)在使用CSortClass时候,响应要排序的CListCtrl的NM_COLUMNCLICK消息,然后Include CSortClass头文件,添加以下类似代码:
CSortClass csc(&m_ListCtrl,iColSelected,bIsNumeric);//m_ListCtrl为待排序的CListCtrl指针,iColSelected为排序的列,bIsNumeric标志是否为数字(否则都按照字符串处理)
csc.Sort(bAscending); //bAscending标志升降序
2)CSortClass不能对汉字进行正确排序,因为汉字编码是Unicode编码,其编码规则不和ASCII相同。
3)由于在EVC中所有编码都是Unicode编码,因此在CsortClass的实现中(代码中红色字体部分)和VC中有些许差别。