用 shell tree contrl  控件 ,再用OnTvnSelchanged 显示选择的文件夹路径,但是只能显示文件夹路径 ,怎么做才能显示文件的路径呢?求助!

解决方案 »

  1.   

    // DirTreeCtrl.cpp : implementation file
    //
    #include "stdafx.h"
    #include "DirTreeCtrl.h"
    #include "shlobj.h"// CDirTreeCtrlIMPLEMENT_DYNAMIC(CDirTreeCtrl, CTreeCtrl)CDirTreeCtrl::CDirTreeCtrl()
    {}CDirTreeCtrl::~CDirTreeCtrl()
    {
    }
    BEGIN_MESSAGE_MAP(CDirTreeCtrl, CTreeCtrl)
    ON_NOTIFY_REFLECT(TVN_ITEMEXPANDED, OnTvnItemexpanded)
    ON_WM_CREATE()
    END_MESSAGE_MAP()// CDirTreeCtrl 消息处理程序void CDirTreeCtrl::OnTvnItemexpanded(NMHDR *pNMHDR, LRESULT *pResult)
    {
    LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
    // TODO: 在此添加控件通知处理程序代码
    TV_ITEM itm = pNMTreeView->itemNew;
    if(itm.state & TVIS_EXPANDED)
    ExpandBranch(itm.hItem);
    else
    DeleteAllChild(itm.hItem);
    *pResult = 0;
    }int CDirTreeCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    if (CTreeCtrl::OnCreate(lpCreateStruct) == -1)
    return -1;
    // TODO:  在此添加您专用的创建代码
    Initialize();
    return 0;
    }void CDirTreeCtrl::Initialize(bool clear)
    {
    LPITEMIDLIST itemList;
    TCHAR buf[60];
    int desktopIcon;
    int mycomputerIcon;
    int ret;
    if(clear)
    DeleteAllItems();
    SetImageList(NULL,0);
    SHGetSpecialFolderLocation(this->m_hWnd, CSIDL_DESKTOP, &itemList);
    SHGetPathFromIDList(itemList,buf);
    m_desktop_path=buf;
    m_img.Create(GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),ILC_COLOR24,50,50);
    m_img.SetBkColor(GetSysColor(COLOR_WINDOW));
    CBitmap bmp;
    CBitmap *old;
    CBitmap *newbmp;
    CDC dc;
    dc.CreateCompatibleDC(NULL);
    bmp.CreateBitmap(32,32,1,24,NULL);
    old = dc.SelectObject(&bmp);
    dc.FillSolidRect(0,0,31,31,GetSysColor(COLOR_WINDOW));
    newbmp=dc.SelectObject(old);
    dc.DeleteDC();
    ret = m_img.Add(newbmp,COLORREF(0x00));
    desktopIcon = m_img.Add(ExtractIcon(AfxGetApp()->m_hInstance,"shell32.dll",34));
    mycomputerIcon = m_img.Add(ExtractIcon(AfxGetApp()->m_hInstance,"shell32.dll",15));
    m_drives_root=AddItem_Core(_T("我的电脑"),TVI_ROOT,true,
    mycomputerIcon,mycomputerIcon);
    m_desktop_root = AddItem(m_desktop_path,TVI_ROOT,true,desktopIcon,desktopIcon);
    }HTREEITEM CDirTreeCtrl::AddItem(const TCHAR *path, HTREEITEM parent,
    bool isDir,int iconEx, int iconEx2)
    {
    SHFILEINFO shinfo,shinfo_sel;
    SHGetFileInfo(path,NULL,
    &shinfo,
    sizeof(shinfo),
    SHGFI_DISPLAYNAME|SHGFI_ICON|SHGFI_SMALLICON);
    SHGetFileInfo(path,NULL,
    &shinfo_sel,
    sizeof(shinfo_sel),
    SHGFI_DISPLAYNAME|SHGFI_ICON|SHGFI_OPENICON|SHGFI_SMALLICON);
    int icon = iconEx!=-1?iconEx:m_img.Add(shinfo.hIcon);
    int iconsel = iconEx2!=-1?iconEx2:m_img.Add(shinfo_sel.hIcon);
    SetImageList(&m_img,LVSIL_NORMAL);
    return AddItem_Core(shinfo.szDisplayName,parent,isDir,icon,iconsel);
    }void CDirTreeCtrl::DeleteAllChild(HTREEITEM itm,bool isEmpty)
    {
    HTREEITEM child;
    child = GetChildItem(itm);
    while(child)
    {
    int img1,img2;
    if(GetChildItem(child))
    DeleteAllChild(GetChildItem(child),isEmpty);
    GetItemImage(child,img1,img2);
    if(img2!=0 && img2!=img1)
    {
    m_img.Remove(img2);
    RefreshTreeImages(m_drives_root,img2);
    RefreshTreeImages(m_desktop_root,img2);
    }
    if(img1!=0)
    {
    m_img.Remove(img1);
    RefreshTreeImages(m_drives_root,img1);
    RefreshTreeImages(m_desktop_root,img1);
    }
    DeleteItem(child);
    SetImageList(&m_img,TVSIL_NORMAL);
    child=GetChildItem(itm);
    }
    if(isEmpty) InsertItem(_T(""),itm);
    }void CDirTreeCtrl::ExpandBranch(HTREEITEM parent)
    {
    bool bOne = false;
    if(parent==m_drives_root)
    {
    TCHAR *ptr;
    DeleteAllChild(parent,false);
    GetLogicalDriveStrings(255,m_drives_name);
    ptr=m_drives_name;
    while(*ptr)
    {
    bOne=true;
    AddItem(ptr,m_drives_root,true);
    ptr+=_tcslen(ptr)+1;
    }
    }
    else
    {
    CString fullpath,pathWildcard;
    fullpath=GetPathFromHere(fullpath,parent);
    DeleteAllChild(parent,false);
    pathWildcard=fullpath+_T("*.*");
    CFileFind finder;
    BOOL bWorking = finder.FindFile(pathWildcard);
    while(bWorking)
    {
    bWorking = finder.FindNextFile();
    if(finder.IsDirectory()&&!finder.IsDots())
    {
    bOne = true;
    HTREEITEM itm = AddItem(fullpath+finder.GetFileName(),
    parent);
    InsertItem(_T(""),itm);
    }
    }
    bWorking = finder.FindFile(pathWildcard);
    while(bWorking)
    {
    bWorking = finder.FindNextFile();
    if(!finder.IsDirectory()&&MatchExtension(finder.GetFileName()))
    {
    bOne = true;
    AddItem(fullpath+finder.GetFileName(),parent);
    }
    }
    }
    if(!bOne)InsertItem(_T(""),parent);
    }HTREEITEM CDirTreeCtrl::AddItem_Core(const TCHAR * name,HTREEITEM parent,bool isDir,int icon,int iconOpen)
    {
    HTREEITEM hitm;
    hitm = InsertItem(name,icon,iconOpen,parent);
    if(isDir)InsertItem(_T(""),hitm);
    return hitm;
    }CString CDirTreeCtrl::GetPathFromHere(CString s, HTREEITEM itm)
    {
    HTREEITEM parent = GetParentItem(itm);
    HTREEITEM itmChild = GetChildItem(itm);
    if(itm==m_drives_root)return _T("");
    if(parent==m_drives_root)
    {
    HTREEITEM child;
    TCHAR *ptr = m_drives_name;
    child = GetChildItem(parent);
    while(child)
    {
    if(child==itm)
    {
    s=CString(ptr)+s;
    return s;
    }
    ptr+=_tcslen(ptr)+1;
    child = GetNextItem(child,TVGN_NEXT);
    }
    }
    else if(itm==m_desktop_root)
    {
    s=m_desktop_path + _T("\\") + s;
    return s;
    }
    else
    {
    if(GetItemText(itm) != CString("")) s = GetItemText(itm)+_T("\\") + s;
    s = GetPathFromHere(s,parent);
    }
    if(!itmChild && s.GetLength()>0) s = s.Left(s.GetLength()-1);
    return s;
    }void CDirTreeCtrl::RefreshTreeImages(HTREEITEM item,int img)
    {
    int iStandard,iOpen;
    HTREEITEM itmCurrent;
    itmCurrent = GetChildItem(item);
    while(itmCurrent)
    {
    if(GetItemImage(itmCurrent,iStandard,iOpen))
    {
    if(iStandard>img)iStandard--;
    if(iOpen>img)iOpen--;
    SetItemImage(itmCurrent,iStandard,iOpen);
    }
    if(ItemHasChildren(itmCurrent)!=0) RefreshTreeImages(itmCurrent,img);
    itmCurrent=GetNextSiblingItem(itmCurrent);
    }
    }bool CDirTreeCtrl::MatchExtension(CString file)
    {
    return file.Right(4)==CString(_T(".exe"));
    }CString CDirTreeCtrl::GetFullPath(HTREEITEM item)
    {
    if(GetItemText(item)==CString(_T(""))) return _T("");
    else return GetPathFromHere(_T(""),item);
    }bool CDirTreeCtrl::SetPath(CString path_in)
    {
    TCHAR path[MAX_PATH];
    TCHAR *delimiters=_T("\\");
    TCHAR *token;
    TCHAR *pathStart = path;
    HTREEITEM current = m_drives_root;
    _tcscpy(path,path_in);
    Expand(current,TVE_EXPAND);
    token = _tcstok(path,delimiters);
    while(token!=NULL)
    {
    current = Dir2Item(current,token);
    if(!current)
    {
    return false;
    }
    Expand(current,TVE_EXPAND);
    token = _tcstok(NULL,delimiters);
    }
    SelectItem(current);
    return true;
    }HTREEITEM CDirTreeCtrl::Dir2Item(HTREEITEM current,TCHAR *dir)
    {
    if(current==m_drives_root)
    {
    HTREEITEM child;
    CString szDir(dir);
    szDir+=_T("\\");
    szDir.MakeUpper();
    TCHAR *ptr = m_drives_name;
    child = GetChildItem(current);
    while(child)
    {
    if(szDir==CString(ptr))
    {
    return child;
    }
    ptr+=_tcslen(ptr)+1;
    child = GetNextItem(child,TVGN_NEXT);
    }
    }
    else
    {
    HTREEITEM child;
    CString szChildText;
    CString szDir(dir);
    szDir.MakeUpper();
    child = GetChildItem(current);
    while(child)
    {
    szChildText = GetItemText(child);
    szChildText.MakeUpper();
    if(szChildText==szDir)
    {
    return child;
    }
    child = GetNextItem(child,TVGN_NEXT);
    }
    }
    return NULL;
    }
    、、、
    #if !defined(AFX_DIRTREECTRL_H__1A45AE0D_BD63_45B6_B4FF_AF00C5882BB1__INCLUDED_)
    #define AFX_DIRTREECTRL_H__1A45AE0D_BD63_45B6_B4FF_AF00C5882BB1__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    // DirTreeCtrl.h : header file
    ///////////////////////////////////////////////////////////////////////////////
    // CDirTreeCtrl windowclass CDirTreeCtrl : public CTreeCtrl
    {
    DECLARE_DYNAMIC(CDirTreeCtrl)public:
    void Initialize(bool clear=true);
    bool SetPath(CString path);
    CString GetFullPath(HTREEITEM item);
    CDirTreeCtrl();
    virtual ~CDirTreeCtrl();
    private:
    HTREEITEM Dir2Item(HTREEITEM current, TCHAR *dir);
    virtual bool MatchExtension(CString file);
    void RefreshTreeImages(HTREEITEM item,int img);
    CString GetPathFromHere(CString s, HTREEITEM itm);
    HTREEITEM AddItem_Core(const TCHAR *name, HTREEITEM parent, bool isDir,
    int icon, int iconOpen);
    void ExpandBranch(HTREEITEM parent);
    void DeleteAllChild(HTREEITEM itm, bool isEmpty=true);
    HTREEITEM AddItem(const TCHAR* path, HTREEITEM parent,
    bool isDir=false, int iconEx=-1,int iconEx2=-1);
    HTREEITEM m_desktop_root;
    CString m_desktop_path;
    HTREEITEM m_drives_root;
    TCHAR m_drives_name[255];
    CImageList m_img;
    protected:
    DECLARE_MESSAGE_MAP()
    public:
    afx_msg void OnTvnItemexpanded(NMHDR *pNMHDR, LRESULT *pResult);
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    };
    ///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_DIRTREECTRL_H__1A45AE0D_BD63_45B6_B4FF_AF00C5882BB1__INCLUDED_)