1.CTreeCtrl的创建
if (!m_treFileList.Create(TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS | TVS_SHOWSELALWAYS | TVS_CHECKBOXES| WS_CHILD | WS_VISIBLE ,CRect(0,0,200,400),this,IDC_TREELIST))
return -1;
2.插入文件
m_hRoot = m_treFileList.InsertItem(L"我的文件");//插入根节点
ShowFile(L"F:\\1", m_hRoot);//以E:\\test为根目录进行遍历
void CDownloadDlg::ShowFile(CString str_Dir, HTREEITEM tree_Root)
{
CFileFind FileFind;
//临时变量,用以记录返回的树节点
HTREEITEM tree_Temp;
//判断输入目录最后是否存在'\',不存在则补充
if (str_Dir.Right(1) != "\\")
str_Dir += "\\";
str_Dir += "*.*";
BOOL res = FileFind.FindFile(str_Dir);
while (res)
{
tree_Temp = tree_Root;
res = FileFind.FindNextFileW();
if (FileFind.IsDirectory() && !FileFind.IsDots())//目录是文件夹
{
CString strPath = FileFind.GetFilePath(); //得到路径,做为递归调用的开始
CString strTitle = FileFind.GetFileName();//得到目录名,做为树控的结点
tree_Temp = m_treFileList.InsertItem(strTitle, 1, 1, tree_Root);//第二个参数是点击前的图片第三个参数是点击后的图片
ShowFile(strPath, tree_Temp);
}
else if (!FileFind.IsDirectory() && !FileFind.IsDots())//如果是文件
{
CString strPath = FileFind.GetFilePath(); //得到路径,做为递归调用的开始
CString strTitle = FileFind.GetFileName();//得到文件名,做为树控的结点
m_treFileList.InsertItem(strTitle, 0, 0, tree_Temp);
}
}
FileFind.Close();
3.添加响应事件当选择的是文件夹时自动选择该文件夹下的文件
ON_NOTIFY(NM_CLICK,IDC_TREELIST,CDownloadDlg::OnClickTree)
void CDownloadDlg::OnClickTree(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
CPoint point;
UINT uFlag; //接收有关点击测试的信息的整数
HTREEITEM hTree;
BOOL bCheck;
GetCursorPos(&point); //获取屏幕鼠标坐标
m_treFileList.ScreenToClient(&point); //转化成客户坐标
hTree = m_treFileList.HitTest(point,&uFlag); //返回与CtreeTtrl关联的光标的当前位置和句柄
if((TVHT_NOWHERE & uFlag))
{
return;
}
if (hTree && (TVHT_ONITEMSTATEICON & uFlag)) //点中复选框
{
m_treFileList.SelectItem(hTree);
CString temp = m_treFileList.GetItemText(hTree) + "\r\n";
TRACE(temp);
bCheck = m_treFileList.GetCheck(hTree); //获取当前复选状态
SetChildCheck(hTree,!bCheck); //设置子项复选状态
SetParentCheck(hTree, bCheck); //设置父项复选状态
}
*pResult = 0;
}
void CDownloadDlg::SetChildCheck(HTREEITEM hTree,BOOL bCheck)
{
m_treFileList.Expand(hTree,TVE_EXPAND);
hTree = m_treFileList.GetChildItem(hTree); //获取子项句柄
while (hTree)
{
m_treFileList.SetCheck(hTree, bCheck);
SetChildCheck(hTree,bCheck); //递归调用
hTree = m_treFileList.GetNextSiblingItem(hTree); //获取兄弟的句柄
}
}
void CDownloadDlg::SetParentCheck(HTREEITEM hTree,BOOL bCheck)
{
HTREEITEM hParent = m_treFileList.GetParentItem(hTree);
if (hParent)
{
HTREEITEM hChild = m_treFileList.GetChildItem(hParent);
while (hChild)
{
if (hChild == hTree)
{
hChild = m_treFileList.GetNextSiblingItem(hChild);
continue;
}
BOOL bflag = m_treFileList.GetCheck(hChild);
if (bCheck == bflag) //判断是否还有兄弟项被选择
{
return;
}
hChild = m_treFileList.GetNextSiblingItem(hChild);
}
m_treFileList.SetCheck(hParent,!bCheck);
SetParentCheck(hParent,bCheck); //设置父项的状态
}
}
4.添加文件夹图标
ImageList4Tree=new CImageList;
bmp.LoadBitmap(IDB_BITMAP1);//bmp文件id
if(!ImageList4Tree->Create(16, 16, ILC_COLOR24 | ILC_MASK, 4, 4))
return FALSE;
ImageList4Tree->Add(&bmp, RGB(255,0,255));
m_treFileList.SetImageList(ImageList4Tree,NULL);