MFC_CFileDialog_選擇文件夾


場景

在MFC中有時候只需要選擇一個文件夾而不需要選擇文件,這時候可以通過下列方式來進行選擇

技術點

  • BROWSEINFO
typedef struct_browseinfo
{
    HWND hwndOwner;
    LPCITEMIDLIST pidlRoot;
    LPSTR pszDisplayName;
    LPCSTR lpszTitle;
    UINT ulFlags;
    BFFCALLBACK lpfn;
    LPARAM lParam;
    int iImage;
}BROWSEINFO,*PBROWSEINFO,*LPBROWSEINFO;

hwndOwner: 瀏覽文件夾對話框的父窗體句柄

pidlRoot:ITEMIDLIST結構的地址,包含瀏覽時的初始根目錄,而且只有被指定的目錄和其子目錄才顯示在瀏覽文件夾對話框中。該成員變量可以是NULL,在此時桌面目錄將被使用。

pszDisplayName:用來保存用戶選中的目錄字符串的內存地址。該緩沖區的大小缺省是定義的MAX_PATH(260)常量宏。

lpszTitle:該瀏覽文件夾對話框的顯示文本,用來提示該瀏覽文件夾對話框的功能、作用和目的。

ulFlags:該標志位描述了對話框的選項。它可以為0,也可以是以下常量的任意組合。

lpfn:應用程序定義的瀏覽對話框回調函數的地址。當對話框中的事件發生時,該對話框將調用回調函數。該參數可用為NULL。

lParam:對話框傳遞給回調函數的一個參數指針。

iImage:與選中目錄相關的圖像。該圖像將被指定為系統圖像列表中的索引值。

ulFlags使用說明:

BIF_BROWSEFORCOMPUTER:返回計算機名。除非用戶選中瀏覽器中的一個計算機名,否則該對話框中的“OK”按鈕為灰色。

BIF_BROWSEFORPRINTER:返回打印機名。除非選中一個打印機名,否則“OK”按鈕為灰色。

BIF_BROWSEINCLUDEFILES:瀏覽器將顯示目錄,同時也顯示文件。

BIF_DONTGOBELOWDOMAIN:在樹形視窗中,不包含域名底下的網絡目錄結構。

BIF_EDITBOX:瀏覽對話框中包含一個編輯框,在該編輯框中用戶可以輸入選中項的名字。

BIF_RETURNFSANCESTORS:返回文件系統的一個節點。僅僅當選中的是有意義的節點時,“OK”按鈕才可以使用。

BIF_RETURNONLYFSDIRS:僅返回文件系統的目錄。例如:在瀏覽文件夾對話框中,當選中任意一個目錄時,該“OK”按鈕可用,而當選中“我的電腦”或“網上鄰居”等非有意義的節點時,“OK”按鈕為灰色。

BIF_STATUSTEXT:在對話框中包含一個狀態區域。通過給對話框發送消息使回調函數設置狀態文本。

BIF_VALIDATE:當沒有BIF_EDITBOX標志位時,該標志位被忽略。如果用戶在編輯框中輸入的名字非法,瀏覽對話框將發送BFFM_VALIDATEFAILED消息給回調函數。

注意:所有標志可以配合使用例如: 
BIF_EDITBOX|BIF_RETURNFSANCESTORS


  • CoTaskMemFree是一種函數,此函數用於釋放被分配的內存塊。
  • TRACE 宏有點象我們以前在C語言中用的Printf函數,使程序在運行過程中輸出一些調試信息,使我們能了解程序的一些狀態。在Output中可以查看到結果。

代碼

void CMFCClistDlg::GUI_Add_Check_Dir()
{
	// TODO: 在此添加命令處理程序代碼
	BROWSEINFO bi;
	wchar_t Buffer[MAX_PATH];

	//初始化入口參數 bi
	bi.hwndOwner = NULL;
	bi.pidlRoot = NULL;
	bi.pszDisplayName = Buffer;
	bi.lpszTitle = L"文件夾路徑選擇";
	bi.ulFlags = BIF_EDITBOX;
	bi.lpfn = NULL;
	bi.iImage = IDR_MAINFRAME;

	LPITEMIDLIST pIDList = SHBrowseForFolder(&bi); //調用顯示選擇對話框 
						   //注意下 這個函數會分配內存 但不會釋放 需要手動釋放


	if (pIDList)
	{
		SHGetPathFromIDList(pIDList, Buffer);
		//CString GamePath;
		//GamePath = Buffer; //將文件夾路徑保存在CString 對象里面
		//取得文件夾路徑放置Buffer空間
		//GUI_ShowMessage(true, Buffer);
		
	}

	CoTaskMemFree(pIDList); //釋放pIDList所指向內存空間;
	TRACE("%d", pIDList);

	// 把變量內容更新到對話框
	UpdateData(FALSE);
}

參考

【MFC】BROWSEINFO結構設置文件夾文件路徑 方法學習與分享!

https://blog.csdn.net/z724133545/article/details/45771707


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM