MFC使用树控件显示磁盘所有目录

dongfangyunliu 2009-10-17 08:40:04
这是我在网上找到的代码,但是只能显示三层目录,怎样能获得磁盘下所有目录并用树控件实现? 代码如下:
BOOL CCFileTreeDlgDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here









////////////////////////////////////////////////////////////////////////////////////////////
//读取磁盘文件
m_ImageList.Create(16,16,ILC_COLOR16,0,0);

m_treeFile.SetImageList(&m_ImageList,TVSIL_NORMAL);



m_treeFile.ModifyStyle(0L,TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT);

size_t alldriver = ::GetLogicalDriveStrings(0,NULL);

_TCHAR *driverstr;

driverstr = new _TCHAR[alldriver + sizeof(_T(""))];

if(GetLogicalDriveStrings(alldriver,driverstr) != alldriver-1)

return FALSE;

_TCHAR *pdriverstr = driverstr;

size_t driversize = strlen(pdriverstr);

HTREEITEM disktree;

while(driversize>0)

{

SHGetFileInfo(pdriverstr,0,&fileinfo,sizeof(fileinfo),SHGFI_ICON);

imindex = m_ImageList.Add(fileinfo.hIcon);

disktree = m_treeFile.InsertItem(pdriverstr,imindex,imindex,TVI_ROOT,TVI_LAST);

pdriverstr += driversize+1;

driversize = strlen(pdriverstr);

}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
return TRUE; // return TRUE unless you set the focus to a control
}







void CCFileTreeDlgDlg::OnDblclkTREEFile(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here




CFileFind filefd;

HTREEITEM parent;

HTREEITEM item = m_treeFile.GetSelectedItem();

if(m_treeFile.GetChildItem(item))return;

parent = item;

CString rootstr = m_treeFile.GetItemText(item);

CString temp;

CString lstr;

if(rootstr.Find("\\") == 2)

{

lstr.Format("%s*.*",rootstr);

}

else

{



CString strparent;

while(1)

{

parent = m_treeFile.GetParentItem(parent);

strparent = m_treeFile.GetItemText(parent);

if(strparent.Find("\\") == 2)

goto end;
//CString root = m_treeFile.GetItemText(parent);

//lstr.Format("%s%s%s\\*.*",root,temp,rootstr);

temp += strparent;

temp += "\\";

}


end:

CString root = m_treeFile.GetItemText(parent);

lstr.Format("%s%s%s\\*.*",root,temp,rootstr);

}

BOOL bfinded = filefd.FindFile(lstr);

while(bfinded)

{

bfinded = filefd.FindNextFile();



if(filefd.IsDirectory()&&!filefd.IsDots())

{

SHGetFileInfo(filefd.GetFilePath(),0,&fileinfo,sizeof(fileinfo),SHGFI_ICON);

imindex = m_ImageList.Add(fileinfo.hIcon);

m_treeFile.InsertItem(filefd.GetFileName(),imindex,imindex,item);

}

}

*pResult = 0;
}
...全文
375 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongfangyunliu 2009-10-24
  • 打赏
  • 举报
回复
谢谢
h122624451 2009-10-19
  • 打赏
  • 举报
回复
/***************************************************************************
函数功能:获取驱动器

参数说明:hParent 获取树控件的父节点



**************************************************************************/
void CTreeViewDlg::GetLogicalDrives(HTREEITEM hParent)
{
size_t szAllDriveStrings = GetLogicalDriveStrings(0,NULL);//获取磁盘中的各个盘符的信息
char *pDriveStrings = new char[szAllDriveStrings + sizeof(_T(""))];
GetLogicalDriveStrings(szAllDriveStrings,pDriveStrings);
size_t szDriveString = strlen(pDriveStrings);
while(szDriveString > 0)
{
m_tree.InsertItem(pDriveStrings,hParent);
pDriveStrings += szDriveString + 1;
szDriveString = strlen(pDriveStrings);
}
}
/**********************************************************************
函数功能:获取磁盘路径信息

参数说明:hParent 树控件的父节点

每个文件夹都有下面两个特殊子文件夹:
(1) .
表示本文件夹自己
(2) ..
表示本文件夹的父文件夹
显然,在文件夹遍历的时候,这两个子文件夹需要特殊处理,
否则将陷入死循环。

IsDots()
就是判断是不是这两个文件夹的一个.

***********************************************************************/

void CTreeViewDlg::GetDriveDir(HTREEITEM hParent)
{
HTREEITEM hChild = m_tree.GetChildItem(hParent); //获取此节点的孩子节点的句柄
while(hChild)
{
CString strText = m_tree.GetItemText(hChild); //获取此孩子几点的文本信息
if(strText.Right(1) != "\\") //其右端不含有路径分隔符
strText += _T("\\"); //获取的是其文件的绝对路径
strText += "*.*"; //使用通配符来标示文件为*.*
CFileFind file;
BOOL bContinue = file.FindFile(strText); //通过其文本标示来标示是否有这个文件
while(bContinue)
{
bContinue = file.FindNextFile();
if(file.IsDirectory() && !file.IsDots())
m_tree.InsertItem(file.GetFileName(),hChild);
}
GetDriveDir(hChild); //获取还在节点的磁盘路径
hChild = m_tree.GetNextItem(hChild,TVGN_NEXT);
}
}
/**********************************************************************
函数功能:展开事件函数,添加TVN_EXPANDED消息处理函数,当一项展开时,为其子项添加下一级目录

参数说明:
***********************************************************************/
void CTreeViewDlg::OnItemexpandedTree(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
TVITEM item = pNMTreeView->itemNew;
if(item.hItem == m_hRoot)
return;
HTREEITEM hChild = m_tree.GetChildItem(item.hItem);
while(hChild)
{
AddSubDir(hChild);
hChild = m_tree.GetNextItem(hChild,TVGN_NEXT);
}
*pResult = 0;
}
/**********************************************************************
函数功能:获取其绝对路径信息

参数说明: hParent
***********************************************************************/
CString CTreeViewDlg::GetFullPath(HTREEITEM hCurrent)
{
CString strTemp;
CString strReturn = ""; //定义其目录的决定路径的字符串标示
while(hCurrent != m_hRoot) //不为根节点的话
{
strTemp = m_tree.GetItemText(hCurrent); //获取当前节点的文本信息
if(strTemp.Right(1) != "\\")
strTemp += "\\";
strReturn = strTemp + strReturn;
hCurrent = m_tree.GetParentItem(hCurrent);
}
return strReturn;
}
/**********************************************************************
函数功能:添加子目录

参数说明: hParent
***********************************************************************/
void CTreeViewDlg::AddSubDir(HTREEITEM hParent)
{
CString strPath = GetFullPath(hParent);
if(strPath.Right(1) != "\\")
strPath += "\\";
strPath += "*.*";
CFileFind file;
BOOL bContinue = file.FindFile(strPath);
while(bContinue)
{
bContinue = file.FindNextFile();
if(file.IsDirectory() && !file.IsDots())
m_tree.InsertItem(file.GetFileName(),hParent);
}
}
/**********************************************************************
函数功能:选中节点触发的事件来列表显示其文件夹中的文件

参数说明:
shiftinfo 包含一个文件的信息
***********************************************************************/
void CTreeViewDlg::OnSelchangedTree(NMHDR* pNMHDR, LRESULT* pResult)
{
m_list.DeleteAllItems();
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
TVITEM item = pNMTreeView->itemNew;
if(item.hItem == m_hRoot)
return;
CString str = GetFullPath(item.hItem);
if(str.Right(1) != "\\")
str += "\\";
str += "*.*";
CFileFind file;
BOOL bContinue = file.FindFile(str);
while(bContinue)
{
bContinue = file.FindNextFile();
if(!file.IsDirectory() && !file.IsDots())
{
SHFILEINFO info; //包含一个文件的信息
CString temp = str;
int index = temp.Find("*.*");
temp.Delete(index,3);
SHGetFileInfo(temp + file.GetFileName(),0,&info,sizeof(&info),SHGFI_DISPLAYNAME | SHGFI_ICON);
int i = m_ImageList.Add(info.hIcon);
m_list.InsertItem(i,info.szDisplayName,i);
}
}
*pResult = 0;
}

在网上找的,做个参考
muzizongheng 2009-10-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dongfangyunliu 的回复:]
只能用vc++ 6.0
[/Quote]

那一样啊, 把它的源文件包含进去, vc6当然也能用了.
WaistCoat13 2009-10-18
  • 打赏
  • 举报
回复
你遍历文件时应该用递归调用。

当发现是目录是时应该用搜索到的目录+"\\*.*"再FindFile,这样才能取得目录下的子目录
dongfangyunliu 2009-10-18
  • 打赏
  • 举报
回复
只能用vc++ 6.0
muzizongheng 2009-10-18
  • 打赏
  • 举报
回复
用vs2008吧, sp1里面就有个控件, CMFCShellTreeCtrl.

msdn下也有这个控件的源码 , 继承于CTreeCtrl.


你可以直接用, 也可以参考它的源码自己重载个.

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧