在對話式應用程式中使用 `CTreeCtrl` 以樹狀結構顯示指定資料夾下的所有檔案與子目錄,採用遞迴演算法實作。
class CFileTreeDlg : public CDialog {
// ...
CTreeCtrl m_FileTree;
CImageList m_iImageList; // 節點圖示
// 原版使用固定層級變數 (已棄用,參考改進版)
HTREEITEM m_hRoot;
HTREEITEM m_hLevel1, m_hLevel2, m_hLevel3, m_hLevel4, m_hLevel5;
HTREEITEM m_hFileItem;
};
void CFileTreeDlg::BrowseFile(int nLevel, CString strPath)
{
nLevel++;
CFileFind finder;
CString strSearch = strPath;
if (strSearch.Right(1) != _T("\\")) strSearch += _T("\\");
strSearch += _T("*.*");
BOOL bFound = finder.FindFile(strSearch);
while (bFound) {
bFound = finder.FindNextFile();
if (finder.IsDots()) continue;
CString strName = finder.GetFileName();
HTREEITEM hParent = NULL;
// 根據層級決定父節點 (原版寫法,建議改用改進版通用遞迴)
switch (nLevel) {
case 1: hParent = NULL; break;
case 2: hParent = m_hLevel1; break;
case 3: hParent = m_hLevel2; break;
case 4: hParent = m_hLevel3; break;
case 5: hParent = m_hLevel4; break;
default: hParent = m_hLevel5; break;
}
if (finder.IsDirectory()) {
HTREEITEM hItem = m_FileTree.InsertItem(strName, 0, 0, hParent);
// 儲存各層級節點供後續使用
switch (nLevel) {
case 1: m_hLevel1 = hItem; break;
case 2: m_hLevel2 = hItem; break;
case 3: m_hLevel3 = hItem; break;
case 4: m_hLevel4 = hItem; break;
default: m_hLevel5 = hItem; break;
}
BrowseFile(nLevel, finder.GetFilePath()); // 遞迴
} else {
// 檔案節點
m_FileTree.InsertItem(strName, 0, 0, hParent);
}
}
finder.Close();
}
BOOL CFileTreeDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 設定視窗圖示
SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FALSE);
// 建立圖示清單 (24x24)
m_iImageList.Create(24, 24, TRUE, 1, 0);
HICON hIcon = (HICON)::LoadImage(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDI_KEBIAO), IMAGE_ICON, 24, 24, 0);
m_iImageList.Add(hIcon);
m_FileTree.SetImageList(&m_iImageList, TVSIL_NORMAL);
// 開始遍歷 (0 代表第 0 層,第一層會變成 1)
BrowseFile(0, _T("課程表"));
return TRUE;
}

// 取得系統圖示索引
SHFILEINFO sfi;
HIMAGELIST hSysImg = (HIMAGELIST)SHGetFileInfo(
path, 0, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
m_FileTree.SetImageList(CImageList::FromHandle(hSysImg), TVSIL_NORMAL);
// 插入時指定圖示
int nImage = finder.IsDirectory() ? sfi.iIcon : sfi.iIcon;
m_FileTree.InsertItem(strName, nImage, nImage, hParent);