用ShellTree控件
想取得 选中目标的路径
然后反应在文本框中
写了下面的代码
void CSearchExploreDlg::OnClickMfcshelltree1(NMHDR*pNMHDR, LRESULT* pResult)
{
// TODO: ここにコントロール通知ハンドラー コードを追加します。
*pResult = 0;
UpdateData();
CString strPath;
m_wbdShellTree.GetItemPath(strPath);
SetDlgItemText(IDC_EDIT1, strPath);}
但是现在的结果总是显示的上一次选中的目标的路径(反应慢一步 )
还想请大神们指教一下

解决方案 »

  1.   

    可以试试通过传递进来的参数  NMTREEVIEW *pNmTreeView = (NMTREEVIEW*)pNMHDR;
      

  2.   


    试过TVN_SELCHANGED
    传递参数 但是没有反应 
    不知道是不是我写错了
    请帮忙看一下void CSearchExploreDlg::OnClickMfcshelltree1(NMHDR* pNMHDR, LRESULT* pResult)
    {
    // TODO: ここにコントロール通知ハンドラー コードを追加します。 //UpdateData(FALSE); CString strPath;
    LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
    HTREEITEM hitem = pNMTreeView->itemNew.hItem;
    m_wbdShellTree.GetItemPath(strPath,NULL);
    SetDlgItemText(IDC_EDIT1, strPath);
    ScreenDisplay(); *pResult = 0;
    }
      

  3.   

    ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, OnSelchangedTree1)void CDlg3Dlg::OnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult) 
    {
      NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
      // TODO: Add your control notification handler code here  CString szSel;
      TVITEM *pItem = &pNMTreeView->itemNew;
      if(pItem->hItem != NULL)
        szSel = m_TreeCtrl.GetItemText(pItem->hItem);
      
      TRACE(_T("Sel=%s\n"), szSel);

      *pResult = 0;
    }
      

  4.   

    szSel 取不到值 是为什么
      

  5.   

    class CLeftView : public CTreeView
    void CLeftView::GetTreePath(const TVITEM *ptvi,char *pbuf)
    {
    CTreeCtrl&  LeftTree=this->GetTreeCtrl(); HTREEITEM hParentItem;
    TVITEM tvi;
    char tviname[MAX_PATH];
    char treepath[MAX_PATH];
    char drivename[MAX_PATH];
    char tmp[MAX_PATH];
    // make a copy of ptvi
    memcpy(&tvi,ptvi,sizeof(TVITEM));
    memset(drivename,0,sizeof(drivename));
    memset(treepath,0,sizeof(treepath));
    hParentItem=tvi.hItem;// init
        while (hParentItem)
    {
    tvi.hItem=hParentItem;// initilized !
    tvi.mask=TVIF_TEXT;  
    tvi.pszText=tviname;
    tvi.cchTextMax=MAX_PATH; 
    strcpy(tviname,LeftTree.GetItemText(tvi.hItem));
    if (strlen(treepath)) sprintf(tmp,"%s\\%s",tviname,treepath);
    else                  sprintf(tmp,"%s",tviname);
    strcpy(treepath,tmp);
    // get parent
    hParentItem=LeftTree.GetParentItem(tvi.hItem);

    // AfxMessageBox(treepath);
    strcpy(pbuf,treepath);
    return;
    }调用
    void CMainFrame::RefreshListView()
    {
    char DestPath[MAX_PATH];
    CLeftView  *LeftView=GetLeftPane();
    CTreeCtrl  &LeftTree=LeftView->GetTreeCtrl();
    TVITEM tvsi;
    HTREEITEM htvi=LeftTree.GetSelectedItem();
    tvsi.hItem=htvi;
    LeftView->GetTreePath(&tvsi,DestPath);

    }