轉(zhuǎn)帖|使用教程|編輯:鮑佳佳|2021-02-04 13:25:59.680|閱讀 450 次
概述:上一講介紹的是消息對(duì)話框,本節(jié)講解文件對(duì)話框。文件對(duì)話框也是很常用的一類(lèi)對(duì)話框。文件對(duì)話框分為打開(kāi)文件對(duì)話框和保存文件對(duì)話框,相信大家在Windows系統(tǒng)中經(jīng)常見(jiàn)到這兩種文件對(duì)話框。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷(xiāo)售中 >>
相關(guān)鏈接:
上一講介紹的是消息對(duì)話框,本節(jié)講解文件對(duì)話框。文件對(duì)話框也是很常用的一類(lèi)對(duì)話框。
文件對(duì)話框的分類(lèi)
文件對(duì)話框分為打開(kāi)文件對(duì)話框和保存文件對(duì)話框,相信大家在Windows系統(tǒng)中經(jīng)常見(jiàn)到這兩種文件對(duì)話框。例如,很多編輯軟件像記事本等都有“打開(kāi)”選項(xiàng),選擇“打開(kāi)”后會(huì)彈出一個(gè)對(duì)話框,讓我們選擇要打開(kāi)文件的路徑,這個(gè)對(duì)話框就是打開(kāi)文件對(duì)話框;除了“打開(kāi)”選項(xiàng)一般還會(huì)有“另存為”選項(xiàng),選擇“另存為”后往往也會(huì)有一個(gè)對(duì)話框彈出,讓我們選擇保存路徑,這就是保存文件對(duì)話框。
Xtreme Toolkit Pro:是屢獲殊榮的VC界面庫(kù),是MFC開(kāi)發(fā)中最全面界面控件套包,它提供了Windows開(kāi)發(fā)所需要的11種主流的Visual C++ MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Grid、Report Control、Shortcut Bar、Syntax Edit、Skin Framework 和Task Panel。
點(diǎn)擊下載Xtreme Toolkit Pro最新試用版
正如上面舉例說(shuō)明的,打開(kāi)文件對(duì)話框用于選擇要打開(kāi)的文件的路徑,保存文件對(duì)話框用來(lái)選擇要保存的文件的路徑。
文件對(duì)話框類(lèi)CFileDialog
MFC使用文件對(duì)話框類(lèi)CFileDialog封裝了對(duì)文件對(duì)話框的操作。CFileDialog類(lèi)的構(gòu)造函數(shù)原型如下:
explicit CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL, DWORD dwSize = 0, BOOL bVistaStyle = TRUE );
參數(shù)說(shuō)明:
bOpenFileDialog:指定要?jiǎng)?chuàng)建的文件對(duì)話框的類(lèi)型。設(shè)為T(mén)RUE將創(chuàng)建打開(kāi)文件對(duì)話框,否則將創(chuàng)建保存文件對(duì)話框。
lpszDefExt:默認(rèn)的文件擴(kuò)展名。如果用戶在文件名編輯框中沒(méi)有輸入擴(kuò)展名,則由lpszDefExt指定的擴(kuò)展名將被自動(dòng)添加到文件名后。默認(rèn)為NULL。
lpszFileName:文件名編輯框中顯示的初始文件名。如果為NULL,則不顯示初始文件名。
dwFlags:文件對(duì)話框的屬性,可以是一個(gè)值也可以是多個(gè)值的組合。關(guān)于屬性值的定義,可以在MSDN中查找結(jié)構(gòu)體OPENFILENAME,元素Flags的說(shuō)明中包含了所有屬性值。默認(rèn)為OFN_HIDEREADONLY和OFN_OVERWRITEPROMPT的組合,OFN_HIDEREADONLY表示隱藏文件對(duì)話框上的“Read Only”復(fù)選框,OFN_OVERWRITEPROMPT表示在保存文件對(duì)話框中如果你選擇的文件存在了,就彈出一個(gè)消息對(duì)話框,要求確定是否要覆蓋此文件。
lpszFilter:文件過(guò)濾器,它是由若干字符串對(duì)組成的一個(gè)字符串序列。如果指定了文件過(guò)濾器,則文件對(duì)話框中只有符合過(guò)濾條件的文件顯示在文件列表中待選擇。給大家看看VS2010 MSDN中給出的一個(gè)例子:
static TCHAR BASED_CODE szFilter[] = _T("Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||");
這樣設(shè)置過(guò)濾器以后,文件對(duì)話框的擴(kuò)展名組合框中將有四個(gè)選項(xiàng):Chart Files (*.xlc)、Worksheet Files (*.xls)、Data Files(*.xlc;*.xls)和All Files (*.*),大家可以看到每種文件的擴(kuò)展名規(guī)定都是一個(gè)字符串對(duì),例如Chart Files的過(guò)濾字符串是Chart Files(*.xlc)和*.xlc成對(duì)出現(xiàn)的。
pParentWnd:文件對(duì)話框的父窗口的指針。
dwSize:OPENFILENAME結(jié)構(gòu)體的大小。不同的操作系統(tǒng)對(duì)應(yīng)不同的dwSize值。MFC通過(guò)此參數(shù)決定文件對(duì)話框的適當(dāng)類(lèi)型(例如,創(chuàng)建Windows 2000文件對(duì)話框還是XP文件對(duì)話框)。默認(rèn)為0,表示MFC將根據(jù)程序運(yùn)行的操作系統(tǒng)版本來(lái)決定使用哪種文件對(duì)話框。
bVistaStyle:指定文件對(duì)話框的風(fēng)格,設(shè)為T(mén)RUE則使用Vista風(fēng)格的文件對(duì)話框,否則使用舊版本的文件對(duì)話框。此參數(shù)僅在Windows Vista中編譯時(shí)適用。
文件對(duì)話框也是模態(tài)對(duì)話框,所以在打開(kāi)時(shí)也需要調(diào)用CFileDialog類(lèi)的DoModal()成員函數(shù)。在打開(kāi)文件對(duì)話框中點(diǎn)了“打開(kāi)”或者在保存文件對(duì)話框中點(diǎn)了“保存”以后,我們可以使用CFileDialog類(lèi)的成員函數(shù)GetPathName()獲取選擇的文件路徑。
下面列出幾個(gè)CFileDialog類(lèi)的成員函數(shù),我們可以使用它們獲得文件對(duì)話框中的各種選擇。
GetFileExt():獲得選定文件的后綴名。
GetFileName():獲得選定文件的名稱,包括后綴名。
GetFileTitle():獲得選定文件的標(biāo)題,即不包括后綴名。
GetFolderPath():獲得選定文件的目錄。
GetNextPathName():獲得下一個(gè)選定的文件的路徑全名。
GetPathName():獲得選定文件的路徑全名。
GetReadOnlyPref():獲得是否“以只讀方式打開(kāi)”。
GetStartPosition():獲得文件名列表中的第一個(gè)元素的位置。
文件對(duì)話框?qū)嵗?/strong>
根據(jù)前面所講內(nèi)容,雞啄米給大家做個(gè)文件對(duì)話框?qū)嵗?
1.創(chuàng)建一個(gè)基于對(duì)話框的MFC應(yīng)用程序工程,名稱設(shè)為“Example17”。
2.修改主對(duì)話框IDD_EXAMPLE17_DIALOG的模板,刪除自動(dòng)生成的“TODO: Place dialog controls here.”靜態(tài)文本框,添加兩個(gè)編輯框,ID分別為IDC_OPEN_EDIT和IDC_SAVE_EDIT,再添加兩個(gè)按鈕,ID分別設(shè)為IDC_OPEN_BUTTON和IDC_SAVE_BUTTON,Caption分別設(shè)為“打開(kāi)”和“保存”。按鈕IDC_OPEN_BUTTON用于顯示打開(kāi)文件對(duì)話框,編輯框IDC_OPEN_EDIT顯示在打開(kāi)文件對(duì)話框中選擇的文件路徑。按鈕IDC_SAVE_BUTTON用于顯示保存文件對(duì)話框,編輯框IDC_SAVE_BUTTON顯示在保存文件對(duì)話框中選擇的文件路徑。
3.分別為按鈕IDC_OPEN_BUTTON和IDC_SAVE_BUTTON添加點(diǎn)擊消息的消息處理函數(shù)CExample17Dlg::OnBnClickedOpenButton()和CExample17Dlg::OnBnClickedSaveButton()。
4.修改兩個(gè)消息處理函數(shù)如下:
C++代碼
void CExample17Dlg::OnBnClickedOpenButton() { // TODO: Add your control notification handler code here // 設(shè)置過(guò)濾器 TCHAR szFilter[] = _T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||"); // 構(gòu)造打開(kāi)文件對(duì)話框 CFileDialog fileDlg(TRUE, _T("txt"), NULL, 0, szFilter, this); CString strFilePath; // 顯示打開(kāi)文件對(duì)話框 if (IDOK == fileDlg.DoModal()) { // 如果點(diǎn)擊了文件對(duì)話框上的“打開(kāi)”按鈕,則將選擇的文件路徑顯示到編輯框里 strFilePath = fileDlg.GetPathName(); SetDlgItemText(IDC_OPEN_EDIT, strFilePath); } } void CExample17Dlg::OnBnClickedSaveButton() { // TODO: Add your control notification handler code here // 設(shè)置過(guò)濾器 TCHAR szFilter[] = _T("文本文件(*.txt)|*.txt|Word文件(*.doc)|*.doc|所有文件(*.*)|*.*||"); // 構(gòu)造保存文件對(duì)話框 CFileDialog fileDlg(FALSE, _T("doc"), _T("my"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, this); CString strFilePath; // 顯示保存文件對(duì)話框 if (IDOK == fileDlg.DoModal()) { // 如果點(diǎn)擊了文件對(duì)話框上的“保存”按鈕,則將選擇的文件路徑顯示到編輯框里 strFilePath = fileDlg.GetPathName(); SetDlgItemText(IDC_SAVE_EDIT, strFilePath); } }
上面顯示編輯框內(nèi)容時(shí)使用了Windows API函數(shù)SetDlgItemText,當(dāng)然也可以先給編輯框關(guān)聯(lián)變量,然后再使用之前在創(chuàng)建對(duì)話框類(lèi)和添加控件變量中介紹的
CDialogEx::UpdateData()函數(shù),但是雞啄米比較習(xí)慣使用SetDlgItemText函數(shù),感覺(jué)比較靈活。
5.運(yùn)行此程序,在結(jié)果對(duì)話框上點(diǎn)“打開(kāi)”按鈕,顯示打開(kāi)文件對(duì)話框如下:
點(diǎn)“保存”按鈕后,顯示保存文件對(duì)話框:
到此,文件對(duì)話框就講完了,是不是依然很簡(jiǎn)單?。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn