为什么回掉函数没有起作用呢?int CALLBACK MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
   CTreeCtrl* pmyTreeCtrl = (CTreeCtrl*) lParamSort;
   CString    strItem1 = pmyTreeCtrl->GetItemText((HTREEITEM) lParam1);
   CString    strItem2 = pmyTreeCtrl->GetItemText((HTREEITEM) lParam2);   // AfxMessageBox("In MyCompareProc(...)!");   return strcmp(strItem2, strItem1);
}void CxxxDlg::OnSort() 
{
    // The pointer to my tree control.
    CTreeCtrl *pmyTreeCtrl = &m_psTree;    TVSORTCB tvs;
    
    tvs.hParent = TVI_ROOT;
    tvs.lpfnCompare = MyCompareProc;
    tvs.lParam = (LPARAM) pmyTreeCtrl;
    
    pmyTreeCtrl->SortChildrenCB(&tvs);
}

解决方案 »

  1.   

    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);
    }