1. 程式人生 > >MFC總結(10) ---- MFC中CFileDialog 實現瀏覽檔案和瀏覽目錄功能

MFC總結(10) ---- MFC中CFileDialog 實現瀏覽檔案和瀏覽目錄功能

 CFileDialog檔案選擇對話方塊的使用:首先構造一個物件並提供相應的引數,建構函式原型如下:


CFileDialog::CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );引數意義如下:

bOpenFileDialog 為TRUE則顯示開啟對話方塊,為FALSE則顯示儲存對話檔案對話方塊。
lpszDefExt 指定預設的副檔名。
lpszFileName 指定預設的檔名。
dwFlags 指明一些特定風格。
lpszFilter 是最重要的一個引數,它指明可供選擇的檔案型別和相應的副檔名。
pParentWnd 為父視窗指標。

lpszFilter引數格式如:
"Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";檔案型別說明和副檔名間用 | 分隔,同種型別檔案的副檔名間可以用 ; 分割,每種檔案型別間用 | 分隔,末尾用 || 指明。

       建立檔案對話方塊可以使用DoModal(),在返回後可以利用下面的函式得到使用者選擇:
CString CFileDialog::GetPathName( ) 得到完整的檔名,包括目錄名和副檔名如:c:\test\test1.txt
CString CFileDialog::GetFileName( ) 得到完整的檔名,包括副檔名如:test1.txt
CString CFileDialog::GetExtName( ) 得到完整的副檔名,如:txt
CString CFileDialog::GetFileTitle ( ) 得到完整的檔名,不包括目錄名和副檔名如:test1
POSITION CFileDialog::GetStartPosition( ) 對於選擇了多個檔案的情況得到第一個檔案位置。
CString CFileDialog::GetNextPathName( POSITION& pos ) 對於選擇了多個檔案的情況得到下一個檔案位置,並同時返回當前檔名。但必須已經呼叫過POSITION CFileDialog::GetStartPosition( )來得到最初的POSITION變數。


實現檔案瀏覽功能

void CRunAddDlg::OnBnClickedButton1()
{
	// TODO:  在此新增控制元件通知處理程式程式碼
	// 設定過濾器   
	TCHAR szFilter[] = _T("啟動檔案(*.exe)|*.exe|所有檔案(*.*)|*.*||");
	// 構造開啟檔案對話方塊   
	CFileDialog fileDlg(TRUE, _T("exe"), NULL, 0, szFilter, this);
	CString strFilePath;
	CString strFileName;

	// 顯示開啟檔案對話方塊   
	if (IDOK == fileDlg.DoModal())
	{
		// 如果點選了檔案對話方塊上的“開啟”按鈕,則將選擇的檔案路徑顯示到編輯框裡   
		strFilePath = fileDlg.GetPathName();
		strFileName = fileDlg.GetFileTitle();
		SetDlgItemText(IDC_RUNEXE_PATH_EDIT1, strFilePath);
		SetDlgItemText(IDC_RUNADD_NAME_EDIT2, strFileName);

	}
}

瀏覽目錄,並獲取目錄路徑

void CRubbishDlg::OnGetBrowseBtn()
{
	strFilePath = _T("");
	BROWSEINFO bi;
	WCHAR Buffer[512];
	//初始化入口引數bi開始
	bi.hwndOwner = NULL;
	bi.pidlRoot = NULL;
	bi.pszDisplayName = Buffer;//此引數如為NULL則不能顯示對話方塊
	bi.lpszTitle = L"選擇路徑";
	bi.ulFlags = BIF_RETURNONLYFSDIRS;
	bi.lpfn = NULL;
	bi.iImage = 0;
	//初始化入口引數bi結束
	LPITEMIDLIST pIDList = SHBrowseForFolder(&bi);//呼叫顯示選擇對話方塊
	if (pIDList)//選擇到路徑(即:點了確定按鈕)
	{
		SHGetPathFromIDList(pIDList, Buffer);
		//取得資料夾路徑到Buffer裡
		strFilePath = Buffer;//將路徑儲存在一個CString物件裡
		m_pathEdit.SetWindowText(strFilePath);  //顯示到edit Control對話方塊中
	}
	else{ return; <span style="white-space: pre;"> </span>//取消選擇} }