树形控件
一、控件属性
先设置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遍历
用到文件CFileFind、CImageList,递归
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双击打开文件