shell tree contrl 控件怎么显示文件路径? 用 shell tree contrl 控件 ,再用OnTvnSelchanged 显示选择的文件夹路径,但是只能显示文件夹路径 ,怎么做才能显示文件的路径呢?求助! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 // 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_) 如何让多人使用一个只能安装在一台电脑上的软件? 请问CListCtrl可以 创建 垂直表头吗 ? 如何判断时间过去了2秒? 16 24位颜色模式下获取屏幕颜色(由GetPixel产生的问题) RadioButton在2003下怎么用? UNICODE 字符集下的字段保存到数据库出现超出设定长度 如何获得其他进程的主窗口句柄? 邮件发送编码问题,高手入 大家好,我刚加入. 如何改变ListCtrl中的subItem地文字颜色,或是向其中添加图标 Cy7c68103上位机读USB数据慢 VS 2010下怎么使用fcntl 函数
//
#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_)