舊版 `SHBrowseForFolder` 僅提供簡陋樹狀視圖,無法新建資料夾。Shell 版本 5.0+ (Win2000 以上) 支援 `BIF_USENEWUI` 旗標,啟用類似檔案總管的現代化介面,含新建資料夾按鈕、右鍵選單、地址列等。
void CTestBrowseDlg::OnBrowse()
{
BROWSEINFO bi = {0};
TCHAR szPath[MAX_PATH] = {0};
bi.hwndOwner = GetSafeHwnd();
bi.pszDisplayName = szPath;
bi.lpszTitle = _T("請選擇資料夾");
bi.ulFlags = BIF_USENEWUI | BIF_RETURNONLYFSDIRS; // 關鍵旗標
LPITEMIDLIST pidl = SHBrowseForFolder(&bi);
if (!pidl) return;
if (SHGetPathFromIDList(pidl, szPath)) {
CString str = szPath;
if (!str.IsEmpty() && str.Right(1) != _T("\\")) str += _T("\\");
m_Path = str; // 綁定到編輯框
UpdateData(FALSE);
}
// 釋放 PIDL 記憶體 (需包含 並連結 shell32.lib)
IMalloc* pMalloc = NULL;
if (SUCCEEDED(SHGetMalloc(&pMalloc))) {
pMalloc->Free(pidl);
pMalloc->Release();
}
}
| 旗標 | 用途 |
|---|---|
| BIF_USENEWUI | 啟用新版 UI (含新建資料夾、右鍵選單) |
| BIF_RETURNONLYFSDIRS | 僅回傳檔案系統資料夾,排除虛擬資料夾 |
| BIF_NEWDIALOGSTYLE | 調整對話框尺寸可拖曳 (Vista+) |
| BIF_BROWSEINCLUDEFILES | 允許選取檔案 (非資料夾) |
設定 `bi.lpfn = BrowseCallbackProc` 可在對話框初始化、選擇變更時自訂行為(如設定預設路徑、過濾特定資料夾)。