CtreeCtrl::SortChildrenCB

探討CtreeCtrl::SortChildrenCB 在實際開發中,我們往往需要對樹控件(CTreeCtrl)的節點進行排序。事實上,大部分的排序工作可以用CTreeCtrl:: SortChildren來實現,不過CTreeCtrl::SortChildren是
簡單的通過樹項目名稱排序,假如要實現個性化排序,則需要藉助 SortChildrenCB。  
  CTreeCtrl::SortChildrenCB這個函數用來實現對樹控件的個性化排序,但是,由於這個函數本身的
缺陷,初學者很難自如的使用這個函數來對樹進行排序,往往失敗了還不知道是什麼原因。
  在這裏,我將詳細介紹一下SortChildrenCB的用法。 首先看看SortChildrenCB的定義:
  BOOL SortChildrenCB( LPTVSORTCB pSort );
  typedef struct tagTVSORTCB
  {
    HTREEITEM hParent;
    PFNTVCOMPARE lpfnCompare;
    LPARAM lParam;
  } TVSORTCB, *LPTVSORTCB;
  解釋一下各個參數的含義:
  LPTVSORTCB psort 這是一個結構體,包含了執行本函數必須的數據。
  hParent 這個參數標誌的是一個樹的某一項,我們要排序的,就是這個項的子項。
  lpfnCompare 這個參數標誌的是一個很重要的回調函數,下面會單獨介紹。
  lParam 這個參數是指向要排序的樹控件的指針
  剛纔說到,lpfnCompare是一個很重要的參數,這是因爲它所標誌的回調函數,將直接影響到排序的結果:
  typedef int (CALLBACK *PFNTVCOMPARE)( LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
  這就是排序回調函數的定義。
  假如你用過STL,就一定知道qsort(),這個快速排序函數也要引用一個回調函數來判別兩個數據項
的大小,TreeCtrl的這個回調函數,恰好類似於qsort的回調函數。
  當我們認爲第一個項應該靠前時,返回一個負數;
  當我們需要顛倒兩個項時,返回一個整數;
  當我們認爲兩個項等價時,我們返回0。
  這樣的定義,恰好和strcmp的返回值相同,因此我們可以很容易的寫出與SortChildren等價的回調
函數:
       int CALLBACK CTestIconDlg::MyCompareProc(LPARAM lParam1, LPARAM lParam2,LPARAM lParamSort)
      {
              CTreeCtrl* pTree = (CTreeCtrl *) lParamSort;
              CString strItem1 = pmyTreeCtrl->GetItemText((HTREEITEM) lParam1);
              CString strItem2 = pmyTreeCtrl->GetItemText((HTREEITEM) lParam2);
              return strcmp(strItem2, strItem1);
      }
  在這裏,我要着重說明兩點:
  第一,看到lParamSort了嗎?它就是你剛纔爲TVSORTCB::lParam所賦的值。
  第二,lParam1和lParam2是什麼?樹的兩個項的data,你可以用SetItemData來指定。
  在剛纔的例子裏面,我們可以斷定它是曾經執行了類似於
  HTREEITEM hLeaf = m_Tree.InsertItem(&tciItem);
  m_Tree.SetItemData(hLeaf, (DWORD)hLeaf);
  的代碼。在這段代碼裏面,該項的HTREEITEM被設置成了自身的Data。這很關鍵,因爲這個值就
是排序的依據。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章