SortClass.cpp
上传用户:ayqaqa
上传日期:2007-01-02
资源大小:37k
文件大小:3k
源码类别:

ListView/ListBox

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "SortClass.h"
  3. /////////////////////////////////////////////////////////////////////////////
  4. // CSortClass
  5. CSortClass::CSortClass(CListCtrl * _pWnd, const int _iCol, const bool _bIsNumeric )
  6. {
  7. iCol = _iCol;
  8. pWnd = _pWnd;
  9. bIsNumeric = _bIsNumeric;
  10. ASSERT(pWnd);
  11. int max = pWnd->GetItemCount();
  12. DWORD dw;
  13. CString txt;
  14. if (bIsNumeric)
  15. {
  16. for (int t = 0; t < max; t++)
  17. {
  18. dw = pWnd->GetItemData(t);
  19. txt = pWnd->GetItemText(t, iCol);
  20. pWnd->SetItemData(t, (DWORD) new CSortItemInt(dw, txt));
  21. }
  22. }
  23. else
  24. {
  25. for (int t = 0; t < max; t++)
  26. {
  27. dw = pWnd->GetItemData(t);
  28. txt = pWnd->GetItemText(t, iCol);
  29. pWnd->SetItemData(t, (DWORD) new CSortItem(dw, txt));
  30. }
  31. }
  32. }
  33. CSortClass::~CSortClass()
  34. {
  35. ASSERT(pWnd);
  36. int max = pWnd->GetItemCount();
  37. if (bIsNumeric)
  38. {
  39. CSortItemInt * pItem;
  40. for (int t = 0; t < max; t++)
  41. {
  42. pItem = (CSortItemInt *) pWnd->GetItemData(t); ASSERT(pItem);
  43. pWnd->SetItemData(t, pItem->dw);
  44. delete pItem;
  45. }
  46. }
  47. else
  48. {
  49. CSortItem * pItem;
  50. for (int t = 0; t < max; t++)
  51. {
  52. pItem = (CSortItem *) pWnd->GetItemData(t);
  53. ASSERT(pItem);
  54. pWnd->SetItemData(t, pItem->dw);
  55. delete pItem;
  56. }
  57. }
  58. }
  59. void CSortClass::Sort(const bool bAsc)
  60. {
  61. if (bIsNumeric)
  62. {
  63. if (bAsc)
  64. pWnd->SortItems(CompareAscI, 0L);
  65. else
  66. pWnd->SortItems(CompareDesI, 0L);
  67. }
  68. else
  69. {
  70. if (bAsc)
  71. pWnd->SortItems(CompareAsc, 0L);
  72. else
  73. pWnd->SortItems(CompareDes, 0L);
  74. }
  75. }
  76. int CALLBACK CSortClass::CompareAsc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
  77. {
  78. CSortItem * i1 = (CSortItem *) lParam1;
  79. CSortItem * i2 = (CSortItem *) lParam2;
  80. ASSERT(i1 && i2);
  81. return i1->txt.CompareNoCase(i2->txt);
  82. }
  83. int CALLBACK CSortClass::CompareDes(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
  84. {
  85. CSortItem * i1 = (CSortItem *) lParam1;
  86. CSortItem * i2 = (CSortItem *) lParam2;
  87. ASSERT(i1 && i2);
  88. return i2->txt.CompareNoCase(i1->txt);
  89. }
  90. int CALLBACK CSortClass::CompareAscI(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
  91. { CSortItemInt * i1 = (CSortItemInt *) lParam1;
  92. CSortItemInt * i2 = (CSortItemInt *) lParam2;
  93. ASSERT(i1 && i2);
  94. if (i1->iInt == i2->iInt) 
  95. return 0;
  96. return i1->iInt > i2->iInt ? 1 : -1;
  97. }
  98. int CALLBACK CSortClass::CompareDesI(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
  99. {
  100. CSortItemInt * i1 = (CSortItemInt *) lParam1;
  101. CSortItemInt * i2 = (CSortItemInt *) lParam2;
  102. ASSERT(i1 && i2);
  103. if (i1->iInt == i2->iInt)
  104. return 0;
  105. return i1->iInt < i2->iInt ? 1 : -1;
  106. }
  107. CSortClass::CSortItem::CSortItem(const DWORD _dw, const CString & _txt)
  108. {
  109. dw = _dw;
  110. txt = _txt;
  111. }
  112. CSortClass::CSortItem::~CSortItem()
  113. {
  114. }
  115. CSortClass::CSortItemInt::CSortItemInt(const DWORD _dw, const CString & _txt)
  116. {
  117. iInt = atoi(_txt);
  118. dw = _dw;
  119. }