MFC選擇資料夾的對話方塊
阿新 • • 發佈:2019-02-15
1,目的
提供一個對話方塊供使用者選擇一個資料夾路徑。
2,原理&實現
先貼上這個工具類的原始碼:
在你的程式中使用靜態方法 CSelectFolderDlg::Show() 就能顯示一個選擇資料夾的對話方塊啦,返回的CString就是所選資料夾路徑。
/* 檔案:SelectFolderDlg.h 說明:提供一個選擇資料夾的對話方塊 */ #ifndef SELECT_FOLDER_DLG_H #define SELECT_FOLDER_DLG_H #ifndef BIF_NEWDIALOGSTYLE #define BIF_NEWDIALOGSTYLE 0x0040 #endif class CSelectFolderDlg { public: //建立一個選擇資料夾的對話方塊,返回所選路徑 static CString Show() { TCHAR szFolderPath[MAX_PATH] = {0}; CString strFolderPath = TEXT(""); BROWSEINFO sInfo; ::ZeroMemory(&sInfo, sizeof(BROWSEINFO)); sInfo.pidlRoot = 0; sInfo.lpszTitle = _T("請選擇一個資料夾:"); sInfo.ulFlags = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE | BIF_EDITBOX; sInfo.lpfn = NULL; // 顯示資料夾選擇對話方塊 LPITEMIDLIST lpidlBrowse = ::SHBrowseForFolder(&sInfo); if (lpidlBrowse != NULL) { // 取得資料夾名 if (::SHGetPathFromIDList(lpidlBrowse,szFolderPath)) { strFolderPath = szFolderPath; } } if(lpidlBrowse != NULL) { ::CoTaskMemFree(lpidlBrowse); } return strFolderPath; } }; #endif
簡單說明下,
有個API可顯示一個瀏覽資料夾的對話方塊,形式為:
LPITEMIDLIST WINAPI SHBrowseForFolder( LPBROWSEINFO lpbi);
引數就一個,這個結構定義:
typedef struct _browseinfo { HWND hwndOwner; // 父視窗控制代碼 LPCITEMIDLIST pidlRoot; // 要顯示的檔案目錄對話方塊的根(Root) LPTSTR pszDisplayName; // 儲存被選取的資料夾路徑的緩衝區 LPCTSTR lpszTitle; // 顯示位於對話方塊左上部的標題 UINT ulFlags; // 指定對話方塊的外觀和功能的標誌 BFFCALLBACK lpfn; // 處理事件的回撥函式 LPARAM lParam; // 應用程式傳給回撥函式的引數 int iImage; // 資料夾對話方塊的圖片索引 } BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO
使用函式前我們建一個這個結構,填一些內容,可以對要顯示的對話方塊做些配置:
BROWSEINFO sInfo;
::ZeroMemory(&sInfo, sizeof(BROWSEINFO));
sInfo.pidlRoot = 0;
sInfo.lpszTitle = _T("請選擇一個資料夾:");
sInfo.ulFlags = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE | BIF_EDITBOX;
sInfo.lpfn = NULL;
這裡設定了對話方塊顯示的目錄樹根目錄、標題、風格等。
現在就可以用它來顯示一個“請選擇一個資料夾”對話方塊了:
返回的 LPITEMIDLIST 是Windows Shell 用來唯一標識一個物件的結構,這裡用它可以獲取我們的路徑值:// 顯示資料夾選擇對話方塊 LPITEMIDLIST lpidlBrowse = ::SHBrowseForFolder(&sInfo);
TCHAR szFolderPath[MAX_PATH] = {0};
::SHGetPathFromIDList(lpidlBrowse,szFolderPath);
3,效果
4,原始碼
vs2008工程下載: