CFileDialog & SHBrowseForFolder()

在研究怎麼開啟檔案的時候因為不知道怎麼下關鍵字

所以找到了 SHBrowseForFolder() 這個用來開目錄的方式

後來發現應該是用 explorer 來下,這才找到了開啟檔案的 CFileDialog class

以下就把兩種實作方式都寫一下,比較詳細的說明可以參考最下面的參考資料

 

[實作過程]

1. 首先在 .h 檔中定義開啟檔案的消息函數:

afx_msg void OpenProject();

 

2. 然后在 .cpp 檔的消息循環中定義消息對應關係:

ON_COMMAND(ID__OPENPROJECT, OpenProject)

 

3. 接著定義消息函數內容:CFileDialog()

filter 是用來設定檔案類型的提示和分類

每個元素都是用 ”|” 隔開 且最後用  “||” 結束

每兩個元素為一組,前面是顯示在對話框上的文字,後面則是他的類型

例如下面的 Project Files|*.dpj 這樣為一組

對話框會顯示”Project Files” 實際的檔案類型為 “*.dpj ”

我們可以設定好幾組檔案類型 只需要一值用 “|” 隔開即可

// Open project when right click the project pop-up menu's open project
afx_msg void CMainFrame::OpenProject()
{	
	CString szFilter = "Project Files|*.dpj|*.*|*.*||";
	CFileDialog fd(TRUE,"dpj","*.dpj",OFN_HIDEREADONLY,szFilter,this);
 
	if(fd.DoModal() == IDOK)
	{
		//If user open an dpj file
		//Get the file's full name (include path)
		CString szFileName = fd.GetPathName(); 
		MessageBox(szFileName);
	}
}

 

2014-07-17-04

 

SHBrowseForFolder():

afx_msg void CMainFrame::OpenProject()
{
	BROWSEINFO bi = {0};
	bi.hwndOwner = this->m_hWnd;
	bi.lpszTitle = "Select folder";
	LPITEMIDLIST pIIL = SHBrowseForFolder(&bi);
	if(pIIL)
	{
		CString path;
		SHGetPathFromIDList(pIIL,path.GetBuffer(256));
		path.ReleaseBuffer();

		// 要自己將SHBrowseForFolder()所傳回的指標釋放掉
		IMalloc *pmal = 0;
		if(SHGetMalloc(&pmal) == S_OK)
		{
			pmal->Free(pIIL);
			pmal->Release();
		}

		// 將使用者選擇的路徑顯示出來 可以改成自己要做的事項
		AfxMessageBox(path);
	}
}

2014-07-17-03

 

其他相關的說明可以再參考下面的資料連結:)

 

[參考資料]

1. 如何開啟選擇目錄的視窗 – SHBrowseForFolder()

2. 使用SHBrowseForFolder函数打开文件目录对话框

3. CFileDialog

4. 可選擇多個檔案的 file dialog