1. 程式人生 > >MFC選擇資料夾的對話方塊

MFC選擇資料夾的對話方塊

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 lpidlBrowse = ::SHBrowseForFolder(&sInfo); 
返回的 LPITEMIDLIST 是Windows Shell 用來唯一標識一個物件的結構,這裡用它可以獲取我們的路徑值:
TCHAR szFolderPath[MAX_PATH] = {0};
::SHGetPathFromIDList(lpidlBrowse,szFolderPath);


3,效果


4,原始碼

vs2008工程下載: