
在選取目錄時,常使用 Shell 函數 SHBrowseForFolder,功能強大但有個缺點:無法一次選取多個目錄,每次僅能回傳單一選取路徑。實務上常需一次選取多個目錄,嘗試用 CFileDialog 卻無法達成。因此參考徐景洲的三態樹實作與 CTreeCtrl 顯示目錄的程式碼,開發出此多目錄選取方案。
建立新的對話方塊型應用程式專案。
將 FolderTreeCtrl.h、FolderTreeCtrl.cpp 加入專案。
folderbmp.bmp → IDB_BITMAP_LISTSTATEBMP.BMP → IDB_BITMAP_STATECFolderTreeCtrl m_tree;
BOOL CMultiFolderDlg::OnInitDialog()
{
CDialog::OnInitDialog();
......
m_imgState.Create(IDB_BITMAP_STATE, 13, 1, RGB(255,255,255));
m_imgList.Create(IDB_BITMAP_LIST, 16, 1, RGB(255,255,255));
m_tree.SetImageList(&m_imgList, TVSIL_NORMAL);
m_tree.SetImageList(&m_imgState, TVSIL_STATE);
m_tree.DisplayTree(NULL, FALSE);
return TRUE;
}
即可獲得一個支援多目錄選取的對話方塊。
具體實作請參考專案原始碼。核心概念為使用三態核取方塊 (未選/部分選/全選) 狀態,配合遞迴遍歷目錄結構,實現父子節點選取狀態的自動同步。
徐景洲的三態樹實作