C++/MFC-Tree Control

树形控件


一、控件属性

先设置CTreeCtrl的属性:
Has Lines          true 显示关系线
Lines at root        true 显示根结点的 关系线和+-号
Has Button         true  显示+-号

Edit Labels         true 则对应 鼠标单击修改树项的名称

二、基础知识

VS2010/MFC编程入门之三十(常用控件:树形控件Tree Control 上)

三、基本用法

VS2010/MFC编程入门之三十一(常用控件:树形控件Tree Control 下)

3.1CTreeCtrl添加根项

HTREEITEM InsertItem( 
LPCTSTR lpszItem, //
HTREEITEM hParent = TVI_ROOT, 
HTREEITEM hInsertAfter = TVI_LAST 
);
//位置
#define TVI_ROOT                ((HTREEITEM)(ULONG_PTR)-0x10000)
#define TVI_FIRST                ((HTREEITEM)(ULONG_PTR)-0x0FFFF)
#define TVI_LAST                ((HTREEITEM)(ULONG_PTR)-0x0FFFE)
#define TVI_SORT                ((HTREEITEM)(ULONG_PTR)-0x0FFFD)

3.2CTreeCtrl添加子项

HTREEITEM InsertItem( 
LPCTSTR lpszItem, //
HTREEITEM hParent = TVI_ROOT, //指定父项 
HTREEITEM hInsertAfter = TVI_LAST //指定插入位置 在hInsertAfter 之后
);

四、遍历目录

4.1遍历

用到文件CFileFindCImageList,递归


void CSliderCtlDlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	CTreeCtrl *p = (CTreeCtrl*)GetDlgItem(IDC_TREE1);
	//设置图标
	m_image.Create(16, 16, ILC_MASK | ILC_COLOR32, 0, 0);
	p->SetImageList(&m_image, TVSIL_NORMAL);
	/*     为什么用\\,应为两个\表示一个\     */
	HTREEITEM hroot = p->InsertItem(L"D:\\study\\");
	FindAllDir(L"D:\\study\\", hroot);
}

// 要遍历路径
int CSliderCtlDlg::FindAllDir(CString path, HTREEITEM parentItem)
{
	CTreeCtrl *p = (CTreeCtrl*)GetDlgItem(IDC_TREE1);
	CFileFind ffind;
	if (path.Right(4) != L"//*.*")//遍历所有文件
		path += L"//*.*";
	int nfound = ffind.FindFile(path);
	while (nfound)
	{
		nfound = ffind.FindNextFileW();
		//去掉.目录,即其本身
		if (ffind.IsDots())
			continue;
		//判断是否是目录
		if (ffind.IsDirectory())
		{
			//获得数据和图标
			SHFILEINFO finfo;
			SHGetFileInfo(ffind.GetFilePath(), 0, &finfo, sizeof(finfo), SHGFI_ICON);
			//添加数据和图标
			HTREEITEM hitem = p->InsertItem(ffind.GetFileTitle(), parentItem);
			p->SetItemImage(hitem, m_image.Add(finfo.hIcon), 0);
			//递归
			FindAllDir(ffind.GetFilePath(), hitem);
			continue;
		}
			//获得数据和图标
			SHFILEINFO finfo;
			SHGetFileInfo(ffind.GetFilePath(), 0, &finfo, sizeof(finfo), SHGFI_ICON);
			//添加数据和图标
			HTREEITEM hitem = p->InsertItem(ffind.GetFileTitle(), parentItem);
			p->SetItemImage(hitem, m_image.Add(finfo.hIcon), 0);
	}
	return 0;
}
因为用了递归,所以当目录下的文件太多时,用起来有点卡。

4.2双击响应

可以参考List Control(图标、报表、列表)风格的3.5双击打开文件





  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值