CMyTreeCtrl* pTreeCtrl = reinterpret_cast<CMyTreeCtrl*>( lParamData );
ASSERT( pTreeCtrl->IsKindOf( RUNTIME_CLASS( CTreeCtrl ) ) ); HTREEITEM  hItem1=(HTREEITEM )lParam1;
HTREEITEM  hItem2=(HTREEITEM )lParam2;
CString strName1=pTreeCtrl->GetItemText(hItem1);
TRACE(strName1);
CString strName2=pTreeCtrl->GetItemText(hItem2);
TRACE(strName2);
可是 strName1和strName2都没有返回值

解决方案 »

  1.   

    你在构造树的时候有没有对每个tree item调用SetItemData函数?
      

  2.   

    http://search.csdn.net/Expert/topic/662/662861.xml?temp=.5025598
    http://search.csdn.net/Expert/topic/1363/1363237.xml?temp=.6535608
      

  3.   

    有,每个树都有setItemData,但是取不到值,而且pTreeCtrl的值是对的,就是下面取得HTREEITEM的时候不对
      

  4.   

    http://blog.csdn.net/fzd999/archive/2004/08/20/80186.aspx
      

  5.   

    to kingzai(stevenzhu) :
    我看过了,但是做起来还是不对!!
    void CDlgDlg::SortTree(HTREEITEM hItem)
    {
    CTreeCtrl * ptree=&m_tree;
    TVSORTCB sortpage;
    sortpage.hParent=hItem;
    sortpage.lpfnCompare=TreeCompareFunction;
    sortpage.lParam=(LPARAM)ptree;
    m_tree.SortChildrenCB(&sortpage);
    }
    static int CALLBACK TreeCompareFunction( LPARAM lParam1, LPARAM lParam2, LPARAM lParamData )
    {
    CTreeCtrl* pTree=(CTreeCtrl*)lParamData;
    HTREEITEM hItem1=(HTREEITEM)lParam1;
    HTREEITEM hItem2=(HTREEITEM)lParam2;
    CString strName1=pTree->GetItemText((HTREEITEM)lParam1);
    CString strName2=pTree->GetItemText((HTREEITEM)lParam1);
    return strcmp(strName1,strName2);
    // DWORD dw1=pTree->GetItemData(hItem1);
    // DWORD dw2=pTree->GetItemData(hItem2);
    // return dw1-dw2;
    }
    上面显示的strName1和strName2值为“”,而且如果使用下面的GetItemData的话就出错!
      

  6.   

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_wcemfc4/html/aflrfCTreeCtrlcolcolSortChildrenCB.asp
    msdn example:
    // Sort the item in reverse alphabetical order.
    static int CALLBACK 
    MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
    {
      // lParamSort contains a pointer to the tree control.
      // The lParam of an item is just its handle.
      CTreeCtrl* pmyTreeCtrl = (CTreeCtrl*) lParamSort;
      CString    strItem1 = pmyTreeCtrl->GetItemText((HTREEITEM) lParam1);
      CString    strItem2 = pmyTreeCtrl->GetItemText((HTREEITEM) lParam2);  return strcmp(strItem2, strItem1);
    }  // The pointer to my tree control.
      extern CTreeCtrl* pmyTreeCtrl;
      TVSORTCB tvs;  // Sort the items in the tree control using my
      // callback procedure.
      tvs.hParent = TVI_ROOT;
      tvs.lpfnCompare = MyCompareProc;
      tvs.lParam = (LPARAM) pmyTreeCtrl;  pmyTreeCtrl->SortChildrenCB(&tvs);
      

  7.   

    to kingzai(stevenzhu) 
    这个例子我看过的,但是为什么我写的时候不对,我感觉我写的代码跟这个一样的阿。有什么问题吗?
      

  8.   

    应用msdn上的这个例子,我发现strItem1和strItme2也是空字符串
    执行不对,我哪个地方做的不对吗?
      

  9.   

    lParam1和lParam2不是treeitem,而是指向tree item data的指针,你要事先设置tree item data,然后把lParam1和lParam2转换成tree item data;
    struct TREEITEMDATA
    {
       CString strItemText;
    }
    TREEITEMDATA *pItem = new TREEITEMDATA;
    pItem->strItemText = GetItemText( hItem );
    SetItemData( hItem , (DWORD)pItem );.... 
    static int CALLBACK MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
    {
        TREEITEMDATA *pItem1 = reinterpret_cast<TREEITEMDATA*>( lParam1 );
        TREEITEMDATA *pItem2 = reinterpret_cast<TREEITEMDATA*>( lParam2 );
    if(pItem1 == NULL || pItem2 == NULL )
    return 0;
             return pItem1->strItemText.Compare( pItem2->strItemtext);
    }
    http://community.csdn.net/Expert/topic/3581/3581655.xml?temp=.8597071