用 shell tree contrl 控制元件 ,再用OnTvnSelchanged 顯示選擇的檔案夾路徑,但是只能顯示檔案夾路徑 ,怎么做才能顯示檔案的路徑呢?求助!
uj5u.com熱心網友回復:
自己獲取檔案路徑 然后來控制顯示uj5u.com熱心網友回復:
// DirTreeCtrl.cpp : implementation file//
#include "stdafx.h"
#include "DirTreeCtrl.h"
#include "shlobj.h"
// CDirTreeCtrl
IMPLEMENT_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 window
class 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_)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/130545.html
標籤:基礎類
