MFC 使用TreeControl展示 目录结构

chuli5639 2017-11-30 04:44:18
我想通过读取文件来展示目录

1,^目录|-- app
2,^文件|-- BaiduMap.apk
2,^目录|-- com.sina.weibo-1
3,^文件|-- base.apk
3,^目录|-- lib
4,^目录|-- arm
5,^文件|-- libgpufilterengine.so
5,^文件|-- libxiaoka.so
5,^文件|-- libweibosdl.so
5,^文件|-- libimgreduce.so
5,^文件|-- libst_sensear.so
2,^文件|-- lib
1,^目录|-- misc


上面的是一个txt文档。

大概就是这样 1,就是第一级目录,app 目录下有BaiduMap.apk ,还有个com.sina,weibo-1目录 ,weibo目录下有base.apk,最后的misc跟app在通过一个根目录下。

我想通过Treecontrol展示出来,该怎么写?是否需要递归呢?
...全文
191 8 点赞 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
schlafenhamster 2017-11-30
我知道 为什么 不能 排序 了

void CAboutDlg::FillTree()
{
	HTREEITEM pParentItem[4096] = { 0 }; 
	m_hRoot=m_tree.InsertItem("Root", 0, 0, TVI_ROOT);
	pParentItem[0] = m_hRoot;
//
	int currentDepth=0; 
	HTREEITEM sonTreeItem;

	CStdioFile file;
	file.Open("ok1.txt", CFile::modeRead);

	CString str;
	while (file.ReadString(str))
	{
		int pos1 = str.Find(",^");
		if (pos1 !=-1)
		{
			CString Name;
			currentDepth = atoi(str.Left(pos1));
			pos1 = str.Find("-- ");
			Name = str.Right(str.GetLength() - pos1 -3);
//afxDump <<currentDepth<< ";" << Name << "\n";
			sonTreeItem = m_tree.InsertItem(Name, pParentItem[currentDepth]);
			pParentItem[currentDepth+1] = sonTreeItem;
		}
	}
	file.Close();  	
}

  • 打赏
  • 举报
回复
schlafenhamster 2017-11-30
1 首先 这个 文件 要 按 深度(即 1,2,3)排序,这样 保证 1 父Item 一定存在。2 同深度 就可以 在 一起处理。 2 根据这个文件 填好 TVINSERTSTRUCT tvis; 然后 m_Tree.InsertItem(&tvis) 如:

BOOL CLeftView::AddAnyItem(char *riffName,char *riffType,DWORD dataSize,DWORD Offset,
												int TreeLevel,BOOL hasChild)
{
	CString str;
	str.Format("%s %s %d 0x%X",riffName, riffType,dataSize, Offset);
	
	TVINSERTSTRUCT tvis;
	ZeroMemory(&tvis,sizeof(tvis));
//
	tvis.hInsertAfter = TVI_LAST;
	tvis.item.mask = TVIF_TEXT | TVIF_CHILDREN;
	tvis.item.cchTextMax = str.GetLength();
	tvis.item.pszText = str.GetBuffer(0);
//	
	CTreeCtrl&  LeftTree=GetTreeCtrl();
	switch(TreeLevel)
	{
	case 0:
		tvis.hParent = TVI_ROOT;
		if(hasChild) tvis.item.cChildren =1;
		m_hTreeItem0 = LeftTree.InsertItem(&tvis);
	break;
	case 1:
		tvis.hParent = m_hTreeItem0;
		if(hasChild) tvis.item.cChildren =1;
		m_hTreeItem1 = LeftTree.InsertItem(&tvis);
	break;
	case 2:
		tvis.hParent = m_hTreeItem1;
		if(hasChild) tvis.item.cChildren =1;
		m_hTreeItem2 = LeftTree.InsertItem(&tvis);
	break;
	case 3:
		tvis.hParent = m_hTreeItem2;
		if(hasChild) tvis.item.cChildren =1;
		m_hTreeItem3 = LeftTree.InsertItem(&tvis);
	break;
	}
//
	return TRUE;
}

  • 打赏
  • 举报
回复
chuli5639 2017-11-30
void CTestTreeViewDlg::OnBnClickedButton1()
{

	FILE* pFile = fopen("E:\\\ok2.txt", "r");

	INT currentDepth=1;  //当前深度
	INT previousDepth=1; //上次深度


	HTREEITEM pTreeItem[4096] = { 0 };
	int iSel = 1;
	
	pTreeItem[1] = m_hRoot;

	HTREEITEM currentTreeItem= m_hRoot;//当前节点  
	HTREEITEM sonTreeItem= m_hRoot;//上次节点 
	HTREEITEM fatherTreeItem = m_hRoot;//上次节点的父节点 

	int maxLevel = 1;
	char cData[256];
	memset(cData, 0, 256);
	fgets(cData, 256, pFile);
	while (strcmp(cData, "") != 0)
	{
		CString strData(cData);
		if (strData.GetLength() != 0)
		{
			int pos1 = strData.Find(",^");
			if (pos1 !=-1)
			{
				CString Name;
				CString depth;
				currentDepth = atoi(strData.Left(pos1));

				pos1 = strData.Find("-- ");
				Name = strData.Right(strData.GetLength() - 1 - pos1 -1 );

				if (currentDepth > previousDepth) //当前节点大于上次节点  这次新加子节点
				{

					sonTreeItem = m_tree.InsertItem(Name, pTreeItem[currentDepth]);

					pTreeItem[currentDepth + 1] = sonTreeItem;
					previousDepth = currentDepth;
					maxLevel++;
					int cc = 0;

				}
				else if (currentDepth == previousDepth) //当前节点等于上次节点  这次新加平级节点
				{
					sonTreeItem = m_tree.InsertItem(Name, pTreeItem[currentDepth]);

					pTreeItem[currentDepth+1] = sonTreeItem;


				}

				else //(currentDepth < previousDepth)
				{
					sonTreeItem = m_tree.InsertItem(Name, pTreeItem[currentDepth]);
					pTreeItem[currentDepth + 1] = sonTreeItem;
					previousDepth = currentDepth;
					int cc = 0;
				}




			}

		}
		memset(cData, 0, 256);
		fgets(cData, 256, pFile);
	}
	fclose(pFile);


//	initf2fs(this);
}
解决了求人不如求己啊~~~~
  • 打赏
  • 举报
回复
chuli5639 2017-11-30
引用 4 楼 schlafenhamster 的回复:
我这个文件 哪里来的? 能产生这个文件话, tree 都填好了 !
大哥你就告诉我吧,我总觉得要用递归呢,但是我还用不好。那个文件是别的程序生成的。我想根据它还原目录结构
  • 打赏
  • 举报
回复
schlafenhamster 2017-11-30
我这个文件 哪里来的? 能产生这个文件话, tree 都填好了 !
  • 打赏
  • 举报
回复
chuli5639 2017-11-30
能根据我这个文件写个例子吗,这些文章我都看了, 这个要处理很多个结点,有点蒙圈 ,老是不对。
  • 打赏
  • 举报
回复
paschen 2017-11-30
schlafenhamster 2017-11-30
搜索“CDirTreeCtrl”
  • 打赏
  • 举报
回复
相关推荐
发帖
VC/MFC
加入

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2017-11-30 04:44
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……