SortColumn.cpp
上传用户:jsxglz
上传日期:2007-01-03
资源大小:117k
文件大小:4k
源码类别:

SQL Server

开发平台:

Visual C++

  1. // CSortColumn.cpp: implementation of the CSortColumn class.
  2. //
  3. #include "stdafx.h"
  4. #ifdef _DEBUG
  5. #undef THIS_FILE
  6. static char THIS_FILE[]=__FILE__;
  7. #define new DEBUG_NEW
  8. #endif
  9. //////////////////////////////////////////////////////////////////////
  10. // CSortColumn
  11. CSortColumn::CSortColumn()
  12. {
  13. ASSERT(FALSE); // use the other one
  14. }
  15. CSortColumn::CSortColumn(CListCtrl* pWnd, const int& nCol, const bool& bIsNumeric)
  16. {
  17.     m_nCol = nCol;
  18.     m_pWnd = pWnd;
  19.     m_bIsNumeric = bIsNumeric;
  20.     
  21.     ASSERT(m_pWnd);
  22.     int nMax = m_pWnd->GetItemCount();
  23.     DWORD dwData;
  24.     CString sTxt;
  25.     if(m_bIsNumeric)
  26.     {
  27.         for(int n = 0; n < nMax; n++)
  28.         {
  29.             dwData = m_pWnd->GetItemData(n);
  30.             sTxt = m_pWnd->GetItemText(n, m_nCol);
  31.             m_pWnd->SetItemData(n, (DWORD)new CSortItemInt(dwData, sTxt));
  32.         }
  33.     }
  34.     else
  35.     {
  36.         for(int n = 0; n < nMax; n++)
  37.         {
  38.             dwData = m_pWnd->GetItemData(n);
  39.             sTxt = m_pWnd->GetItemText(n, m_nCol);
  40.             m_pWnd->SetItemData(n, (DWORD)new CSortItemText(dwData, sTxt));
  41.         }
  42.     }
  43. }
  44. CSortColumn::~CSortColumn()
  45. {
  46.     ASSERT(m_pWnd);
  47.     int nMax = m_pWnd->GetItemCount();
  48. if(m_bIsNumeric)
  49.     {
  50.         CSortItemInt* pItem;
  51. for(int n = 0; n < nMax; n++)
  52.         {
  53.             pItem = (CSortItemInt*)m_pWnd->GetItemData(n);
  54.             ASSERT(pItem);
  55.             m_pWnd->SetItemData(n, pItem->m_dwData);
  56.             delete pItem;
  57.         }
  58.     }
  59.     else
  60.     {
  61.         CSortItemText* pItem;
  62.         for(int n = 0; n < nMax; n++)
  63.         {
  64.             pItem = (CSortItemText*)m_pWnd->GetItemData(n);
  65.             ASSERT(pItem);
  66.             m_pWnd->SetItemData(n, pItem->m_dwData);
  67.             delete pItem;
  68.         }
  69.     }
  70. }
  71. void CSortColumn::Sort(const bool& bAsc)
  72. {
  73.     if(m_bIsNumeric)
  74.     {
  75.         if(bAsc)
  76.             m_pWnd->SortItems(CompareAscInt, 0L);
  77. else
  78.             m_pWnd->SortItems(CompareDesInt, 0L);
  79.     }
  80.     else
  81.     {
  82.         if(bAsc)
  83.             m_pWnd->SortItems(CompareAscText, 0L);
  84. else
  85.             m_pWnd->SortItems(CompareDesText, 0L);
  86.     }
  87. }
  88. int CALLBACK CSortColumn::CompareAscText(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
  89. {
  90.     CSortItemText* pItem1 = (CSortItemText*)lParam1;
  91.     CSortItemText* pItem2 = (CSortItemText*)lParam2;
  92.     ASSERT(pItem1 && pItem2);
  93.     return pItem1->m_strTxt.CompareNoCase(pItem2->m_strTxt);
  94. }
  95. int CALLBACK CSortColumn::CompareDesText(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
  96. {
  97.     CSortItemText* pItem1 = (CSortItemText*)lParam1;
  98.     CSortItemText* pItem2 = (CSortItemText*)lParam2;
  99.     ASSERT(pItem1 && pItem2);
  100.     return pItem2->m_strTxt.CompareNoCase(pItem1->m_strTxt);
  101. }
  102. int CALLBACK CSortColumn::CompareAscInt(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
  103. {
  104.     CSortItemInt* pItem1 = (CSortItemInt*)lParam1;
  105.     CSortItemInt* pItem2 = (CSortItemInt*)lParam2;
  106.     ASSERT(pItem1 && pItem2);
  107.     if(pItem1->m_nInt == pItem2->m_nInt)
  108. return 0;
  109.     return pItem1->m_nInt > pItem2->m_nInt ? 1 : -1;
  110. }
  111. int CALLBACK CSortColumn::CompareDesInt(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
  112. {
  113.     CSortItemInt* pItem1 = (CSortItemInt*)lParam1;
  114.     CSortItemInt* pItem2 = (CSortItemInt*)lParam2;
  115.     ASSERT(pItem1 && pItem2);
  116.     if(pItem1->m_nInt == pItem2->m_nInt)
  117. return 0;
  118.     return pItem1->m_nInt < pItem2->m_nInt ? 1 : -1;
  119. }
  120. //////////////////////////////////////////////////////////////////////
  121. // CSortItemText
  122. CSortItemText::CSortItemText()
  123. {
  124. ASSERT(FALSE); // use the other one  
  125. }
  126. CSortItemText::CSortItemText(const DWORD& dwData, const CString& sTxt)
  127. {
  128.     m_dwData = dwData;
  129.     m_strTxt = sTxt;
  130. }
  131. CSortItemText::~CSortItemText()
  132. {
  133. }
  134. //////////////////////////////////////////////////////////////////////
  135. // CSortItemInt
  136. CSortItemInt::CSortItemInt()
  137. {
  138. ASSERT(FALSE); // use the other one  
  139. }
  140. CSortItemInt::CSortItemInt(const DWORD& dwData, const CString& sTxt)
  141. {
  142.     m_dwData = dwData;
  143. m_nInt = atoi(sTxt);
  144. }
  145. CSortItemInt::~CSortItemInt()
  146. {
  147. }