VS2013/MFC程式設計入門之十六(對話方塊:檔案對話方塊)
上一講介紹的是訊息對話方塊,本節講解檔案對話方塊。
檔案對話方塊的分類
檔案對話方塊分為開啟檔案對話方塊和儲存檔案對話方塊,相信大家在Windows系統中經常見到這兩種檔案對話方塊。例如,很多編輯軟體像記事本等都有“開啟”選項,選擇“開啟”後會彈出一個對話方塊,讓我們選擇要開啟檔案的路徑,這個對話方塊就是開啟檔案對話方塊;除了“開啟”選項一般還會有“另存為”選項,選擇“另存為”後往往也會有一個對話方塊彈出,讓我們選擇儲存路徑,這就是儲存檔案對話方塊。
正如上面舉例說明的,開啟檔案對話方塊用於選擇要開啟的檔案的路徑,儲存檔案對話方塊用來選擇要儲存的檔案的路徑。
檔案對話方塊類CFileDialog
MFC使用檔案對話方塊類CFileDialog封裝了對檔案對話方塊的操作。CFileDialog類的建構函式原型如下:
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
);
引數說明:
bOpenFileDialog:指定要建立的檔案對話方塊的型別。設為TRUE將建立開啟檔案對話方塊,否則將建立儲存檔案對話方塊。
lpszDefExt:預設的副檔名。如果使用者在檔名編輯框中沒有輸入副檔名,則由lpszDefExt指定的副檔名將被自動新增到檔名後。預設為NULL。
lpszFileName:檔名編輯框中顯示的初始檔名。如果為NULL,則不顯示初始檔名。
dwFlags:檔案對話方塊的屬性,可以是一個值也可以是多個值的組合。關於屬性值的定義,可以在MSDN中查詢結構體OPENFILENAME,元素Flags的說明中包含了所有屬性值。預設為OFN_HIDEREADONLY和OFN_OVERWRITEPROMPT的組合,OFN_HIDEREADONLY表示隱藏檔案對話方塊上的“只讀”複選框,OFN_OVERWRITEPROMPT表示在儲存檔案對話方塊中如果你選擇的檔案存在了,就彈出一個訊息對話方塊,要求確定是否要覆蓋此檔案。
lpszFilter:檔案過濾器,它是由若干字串對組成的一個字串序列。如果指定了檔案過濾器,則檔案對話方塊中只有符合過濾條件的檔案顯示在檔案列表中待選擇。給大家看看VS2010 MSDN中給出的一個例子:
static TCHAR BASED_CODE szFilter[] = _T("Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||");
這樣設定過濾器以後,檔案對話方塊的副檔名組合框中將有四個選項:插入檔案 (*.xlc)、表格Files (*.xls)、資料Files(*.xlc;*.xls)和All Files (*.*),大家可以看到每種檔案的副檔名規定都是一個字串對,例如插入Files的過濾字串是插入Files(*.xlc)和*.xlc成對出現的。
pParentWnd:檔案對話方塊的父視窗的指標。
dwSize:OPENFILENAME結構體的大小。不同的作業系統對應不同的dwSize值。MFC通過此引數決定檔案對話方塊的適當型別(例如,建立Windows 2000檔案對話方塊還是XP檔案對話方塊)。預設為0,表示MFC將根據程式執行的作業系統版本來決定使用哪種檔案對話方塊。
bVistaStyle:指定檔案對話方塊的風格,設為TRUE則使用Vista風格的檔案對話方塊,否則使用舊版本的檔案對話方塊。此引數僅在Windows Vista中編譯時適用。
檔案對話方塊也是模態對話方塊,所以在開啟時也需要呼叫CFileDialog類的DoModal()成員函式。在開啟檔案對話方塊中點了“開啟”或者在儲存檔案對話方塊中點了“儲存”以後,我們可以使用CFileDialog類的成員函式GetPathName()獲取選擇的檔案路徑。
下面列出幾個CFileDialog類的成員函式,我們可以使用它們獲得檔案對話方塊中的各種選擇。
GetFileExt():獲得選定檔案的字尾名。
GetFileName():獲得選定檔案的名稱,包括字尾名。
GetFileTitle():獲得選定檔案的標題,即不包括字尾名。
GetFolderPath():獲得選定檔案的目錄。
GetNextPathName():獲得下一個選定的檔案的路徑全名。
GetPathName():獲得選定檔案的路徑全名。
GetReadOnlyPref():獲得是否“以只讀方式開啟”。
GetStartPosition():獲得檔名列表中的第一個元素的位置。
檔案對話方塊例項
根據前面所講內容,雞啄米給大家做個檔案對話方塊例項。
1.建立一個基於對話方塊的MFC應用程式工程,名稱設為“Example17”。
2.修改主對話方塊IDD_EXAMPLE17_DIALOG的模板,刪除自動生成的“TODO: 在此放置對話方塊控制元件”靜態文字框,新增兩個編輯框,ID分別為IDC_OPEN_EDIT和IDC_SAVE_EDIT,再新增兩個按鈕,ID分別設為IDC_OPEN_BUTTON和IDC_SAVE_BUTTON,Caption分別設為“開啟”和“儲存”。按鈕IDC_OPEN_BUTTON用於顯示開啟檔案對話方塊,編輯框IDC_OPEN_EDIT顯示在開啟檔案對話方塊中選擇的檔案路徑。按鈕IDC_SAVE_BUTTON用於顯示儲存檔案對話方塊,編輯框IDC_SAVE_BUTTON顯示在儲存檔案對話方塊中選擇的檔案路徑,同時修改該對話方塊的Caption為“資料夾對話方塊操作”。。
3.分別為按鈕IDC_OPEN_BUTTON和IDC_SAVE_BUTTON新增點選訊息的訊息處理函式CExample17Dlg::OnBnClickedOpenButton()和CExample17Dlg::OnBnClickedSaveButton()。
4.修改兩個訊息處理函式如下:
C++程式碼- void CExample17Dlg::OnBnClickedOpenButton()
- {
- // TODO: Add your control notification handler code here
- // 設定過濾器
- TCHAR szFilter[] = _T("文字檔案(*.txt)|*.txt|所有檔案(*.*)|*.*||");
- // 構造開啟檔案對話方塊
- CFileDialog fileDlg(TRUE, _T("txt"), NULL, 0, szFilter, this);
- CString strFilePath;
- // 顯示開啟檔案對話方塊
- if (IDOK == fileDlg.DoModal())
- {
- // 如果點選了檔案對話方塊上的“開啟”按鈕,則將選擇的檔案路徑顯示到編輯框裡
- strFilePath = fileDlg.GetPathName();
- SetDlgItemText(IDC_OPEN_EDIT, strFilePath);
- }
- }
- void CExample17Dlg::OnBnClickedSaveButton()
- {
- // TODO: Add your control notification handler code here
- // 設定過濾器
- TCHAR szFilter[] = _T("文字檔案(*.txt)|*.txt|Word檔案(*.doc)|*.doc|所有檔案(*.*)|*.*||");
- // 構造儲存檔案對話方塊
- CFileDialog fileDlg(FALSE, _T("doc"), _T("my"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, this);
- CString strFilePath;
- // 顯示儲存檔案對話方塊
- if (IDOK == fileDlg.DoModal())
- {
- // 如果點選了檔案對話方塊上的“儲存”按鈕,則將選擇的檔案路徑顯示到編輯框裡
- strFilePath = fileDlg.GetPathName();
- SetDlgItemText(IDC_SAVE_EDIT, strFilePath);
- }
- }
上面顯示編輯框內容時,本文使用了Windows API函式SetDlgItemText,當然也可以先給編輯框關聯變數,然後再使用在建立對話方塊類和新增控制元件變數中介紹的CDialogEx::UpdateData()函式,但是習慣上使用SetDlgItemText函式,感覺比較靈活。
5.執行此程式,在結果對話方塊上點“開啟”按鈕,顯示開啟檔案對話方塊如下:
點“儲存”按鈕後,顯示儲存檔案對話方塊:
在開啟檔案對話方塊和儲存檔案對話方塊都選擇了檔案路徑後,主對話方塊如下:
到此,檔案對話方塊就講完了,是不是依然很簡單?如果忘記了檔案對話方塊類建構函式的引數意義,可以回到本部落格來看看或者在MSDN上查閱。
相關推薦
VS2013/MFC程式設計入門之十六(對話方塊:檔案對話方塊)
上一講介紹的是訊息對話方塊,本節講解檔案對話方塊。 檔案對話方塊的分類 檔案對話方塊分為開啟檔案對話方塊和儲存檔案對話方塊,相信大家在Windows系統中經常見到這兩種檔案對話方塊。例如,很多編輯軟體像記事本等都有“開啟”選項,選擇“開啟”後會彈出一個對
VS2013/MFC程式設計入門之十九(常用控制元件:靜態文字框)
從本節開始講解各種常用控制元件的用法。MFC中常用控制元件主要包括:靜態文字框、編輯框、單選按鈕、複選框、分組框、列表框、組合框、圖片控制元件、列表控制元件、樹形控制元件和進度條控制元件等等。本節先來講解靜態文字框的使用。 控制元件的通知訊息
VS2013/MFC程式設計入門之十二(對話方塊:屬性頁對話方塊及相關類的介紹)
本節開始講一種特殊的對話方塊--屬性頁對話方塊。 屬性頁對話方塊的分類 屬性頁對話方塊想必大家並不陌生,XP系統中桌面右鍵點屬性,彈出的就是屬性頁對話方塊,它通過標籤切換各個頁面。另外,我們在建立MFC工程時使用的嚮導對話方塊也屬於屬性頁對
VS2013/MFC程式設計入門之十五(對話方塊:訊息對話方塊)
本節講解Windows系統中最常用最簡單的一類對話方塊--訊息對話方塊。 我們在使用Windows系統的過程中經常會見到訊息對話方塊,提示我們有異常發生或提出詢問等。因為在軟體開發中經常用到訊息對話方塊,所以MFC提供了兩個函式可以直接生成指
VS2013/MFC程式設計入門之十一(對話方塊:非模態對話方塊的建立及顯示)
上一節講了模態對話方塊及其彈出過程,本節接著講另一種對話方塊--非模態對話方塊的建立及顯示。 前面已經說過,非模態對話方塊顯示後,程式其他視窗仍能正常執行,可以響應使用者輸入,還可以相互切換。本文中將上一講中建立的Tip模態對話方塊改為非模態對話方塊,讓
VS2013/MFC程式設計入門之二十三(常用控制元件:列表框控制元件ListBox)
前面兩節講了比較常用的按鈕控制元件,並通過按鈕控制元件例項說明了具體用法。本文要講的是列表框控制元件(ListBox)及其使用例項。 列表框控制元件簡介 列表框給出了一個選項清單,允許使用者從中進行單項或多項選擇,被選中的項會高亮顯示。列表
VS2013/MFC程式設計入門之二十六(常用控制元件:圖片控制元件Picture Control)
本節主要講一種簡單實用的控制元件,圖片控制元件Picture Control。通過使用圖片控制元件我們可以在介面某個位置顯示圖片以美化介面。 圖片控制元件簡介 圖片控制元件和前面講到的靜態文字框都是靜態文字控制元件,因此兩者的使用方法有很多
VS2013/MFC程式設計入門之三十二(選單:VS2013選單資源詳解)
前面我們已經講完了所有的常用控制元件,本節開始為大家講解選單的概念及使用。 選單簡介 選單可以分為下拉式選單和彈出式選單。 下拉式選單一般在視窗標題欄下面顯示,大家還記得我們在VS2013/MFC程式設計入門之一(利用MFC
VS2013/MFC程式設計入門之六(對話方塊:為對話方塊新增控制元件)
建立對話方塊資源需要建立對話方塊模板、修改對話方塊屬性、為對話方塊新增各種控制元件等步驟,前面一講中已經講了建立對話方塊模板和修改對話方塊屬性,本節繼續講如何為對話方塊新增控制元件。 上一講中建立了一個名為“Addition”的工程,目的是生成一個實現加法
VS2013/MFC程式設計入門之二十七(常用控制元件:列表檢視控制元件List Control 上)
本節為大家詳解列表檢視控制元件List Control的使用。 列表檢視控制元件簡介 列表檢視控制元件List Control同樣比較常見,它能夠把任何字串內容以列表的方式顯示出來,這種顯示方式的特點是整潔、直觀,在實際應用中能為使
VS2013/MFC程式設計入門之三十一(常用控制元件:標籤控制元件Tab Control )
前面兩節講了樹形控制元件Tree Control,本節開始講解標籤控制元件Tab Control,也可以稱為選項卡控制元件。 標籤控制元件簡介 標籤控制元件也比較常見。它可以把多個頁面整合到一個視窗中,每個頁面對應一個標籤,使用者點選某個標
VS2013/MFC程式設計入門之二十四(常用控制元件:組合框控制元件Combo Box)
上一節講了列表框控制元件ListBox的使用,本節主要講解組合框控制元件Combo Box。組合框同樣相當常見,例如,在Windows系統的控制面板上設定語言或位置時,有很多選項,用來進行選擇的控制元件就是組合框控制元件。 組合框控制元件簡介
VS2013/MFC程式設計入門之七(對話方塊:建立對話方塊類和新增控制元件變數)
前兩講中為大家講解了如何建立對話方塊資源。建立好對話方塊資源後要做的就是生成對話方塊類了。再宣告下,生成對話方塊類主要包括新建對話方塊類、新增控制元件變數和控制元件的訊息處理函式等。 因為給大家的例程Addition是基於對話方塊的程式,所以程式自動建立了
VS2013/MFC程式設計入門之三(MFC應用程式框架分析)
上一講講的是VS2013應用程式工程中檔案的組成結構。這一節就為大家分析下MFC應用程式框架的執行流程。 一.SDK應用程式與MFC應用程式執行過程的對比 程式執行都要有入口函式,在之前的C++教程中都是main函式,而Windows應
VS2010/MFC程式設計入門之四十三(MFC常用類:CTime類和CTimeSpan類)
轉載: http://www.jizhuomi.com/software/230.html 上一節中雞啄米講了MFC常用類CString類的用法,本節繼續講另外兩個MFC常用類-日期和時間類CTime類和CTimeSpan類。  
python 入門之 – 十六進位制運算(二十)
二進位制是由 0 ~ 1 組成的 八進位制是由 0 ~ 7組成的 十進位制是由 0 ~ 9組成的 十六進位制是由 0 ~ 15 組成的,可是 9 後面的的 10 是用字母來代替 A~ F ,也就是 0 ~ F,用字母代替了數字,避免不再重複 之前剛接觸 python 的時候學了以下 二進
【Java併發程式設計】之十六:深入Java記憶體模型——happen-before規則及其對DCL的分析(含程式碼)
happen—before規則介紹 Java語言中有一個“先行發生”(happen—before)的規則,它是Java記憶體模型中定義的兩項操作之間的偏序關係,如果操作A先行發生於操作B,其意思就是說,在發生操作B之前,操作A產生的影響都能被操作B觀察到,“影響
Java併發程式設計系列之十六:Lock鎖
Lock鎖簡介 Lock鎖機制是JDK 5之後新增的鎖機制,不同於內建鎖,Lock鎖必須顯式宣告,並在合適的位置釋放鎖。Lock是一個介面,其由三個具體的實現:ReentrantLock、ReetrantReadWriteLock.ReadLock 和 Ree
VS2010/MFC程式設計入門之前言
VC++簡介 VC++全稱是Visual C++,是由微軟提供的C++開發工具,它與C++的根本區別就在於,C++是語言,而VC++是用C++語言編寫程式的工具平臺。VC++不僅是一個編譯器更是一個整合開發環境,包括編輯器、偵錯程式和編譯器等,一般它包含
Html學習之十六(表格與表單學習--課程表制作)
居中 htm meta rowspan title 結果 utf-8 使用 class <!DOCTYPE html> <html> <head> <meta charset="UTF-8">