⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 foldertree.cpp

📁 功能: 实现目录树中文件夹
💻 CPP
字号:
// FolderTree.cpp : implementation file
//

#include "stdafx.h"
#include "MyFolder.h"
#include "FolderTree.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CFolderTree

CFolderTree::CFolderTree()
{
}

CFolderTree::~CFolderTree()
{
}


BEGIN_MESSAGE_MAP(CFolderTree, CTreeCtrl)
	//{{AFX_MSG_MAP(CFolderTree)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFolderTree message handlers
void CFolderTree::FillItem(CFolder* pFolder, HTREEITEM hParentItem, BOOL bExpand/*=FALSE*/)
{
	if(!pFolder)//填充结点函数
		return;//pFolder为空则返回

	CString strFolderName;//定义文件夹名称变量
	TV_INSERTSTRUCT TreeCtrlItem;//定义TreeCtrlItem

	if (hParentItem == NULL)//如果父亲结点为空
	{
		TreeCtrlItem.hParent = TVI_ROOT;//定义为根结点
	}
	else
	{
		TreeCtrlItem.hParent = hParentItem;//否则定义为父亲结点
	}

	TreeCtrlItem.hInsertAfter = TVI_LAST;//最后插入结点
	TreeCtrlItem.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE;
//激活上述iImage,iSelectedImage,lParam属性
	strFolderName = pFolder->GetFolderName();//获取文件夹名(GetFolderName为已定义函数)
	TreeCtrlItem.item.pszText = strFolderName.GetBuffer(strFolderName.GetLength());//得到文件名
	strFolderName.ReleaseBuffer();//释放GetBuffer

	if(hParentItem == TVI_ROOT)//如果父亲结点为根结点
	{
		TreeCtrlItem.item.iImage = 3;//选取一个新建文件图象(3为“工程”图象)
		TreeCtrlItem.item.iSelectedImage = 3;//选中该节点时的图象

	}
	else//如果父亲结点不为根结点
	{
		TreeCtrlItem.item.iImage = 0;//选取一个新建文件图象(0为“文件夹”图象)
		TreeCtrlItem.item.iSelectedImage = 1;3;//选中该节点时的图象(1为“打开的文件夹”图象)
	}

	TreeCtrlItem.item.lParam = (LPARAM)pFolder;

	hParentItem = InsertItem(&TreeCtrlItem);//插入结点


	CString strFullFileName;//定义“全文件名”变量
	CString strFileName;//定义“文件名”变量
	int nCount = 0;//定义nCount
	int nIndex = pFolder->m_FileNameArray.GetSize();//获取文件列表大小
	HTREEITEM htChildItem;//定义“子结点”变量
	while(nIndex--)//对文件列表所有文件进行操作
	{
		strFullFileName = pFolder->m_FileNameArray.GetAt(nIndex);//获取文件路径
		nCount = strFullFileName.GetLength() - strFullFileName.ReverseFind('\\')-1;//计算文件名字符数
		strFileName = strFullFileName.Right(nCount);//获取文件名

		TreeCtrlItem.hParent = hParentItem;//定义为父亲结点
		TreeCtrlItem.item.pszText = strFileName.GetBuffer(strFileName.GetLength());//获取结点文件名
		strFullFileName.ReleaseBuffer();//释放GetBuffer
		TreeCtrlItem.item.iImage = 2;0;//选取一个文件图象(2为“文件”图象)
		TreeCtrlItem.item.iSelectedImage = 2;//选中该节点时的图象(2为“文件”图象)
		TreeCtrlItem.item.lParam = (LPARAM)pFolder;

		htChildItem = InsertItem(&TreeCtrlItem);//插入结点
	}

	POSITION pos = pFolder->m_FolderList.GetHeadPosition();//获得子文件夹列表位置的第一个元素
	while (pos != NULL)//如果不是空的
	{
		pFolder = (CFolder*)pFolder->m_FolderList.GetNext(pos);//指向下一个元素
		FillItem(pFolder, hParentItem);//递归调用FillItem函数,填充文件
	}
	
	if(bExpand)
		Expand(hParentItem, TVE_EXPAND);//扩充子结点列表
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -