1. 程式人生 > >VS2010/MFC(對話方塊:檔案對話方塊)

VS2010/MFC(對話方塊:檔案對話方塊)

本文轉載於http://www.jizhuomi.com/software/173.html
檔案對話方塊的分類

      檔案對話方塊分為開啟檔案對話方塊和儲存檔案對話方塊,相信大家在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表示隱藏檔案對話方塊上的“Read Only”複選框,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 (*.*)|*.*||");

       這樣設定過濾器以後,檔案對話方塊的副檔名組合框中將有四個選項:Chart Files (*.xlc)、Worksheet Files (*.xls)、Data Files(*.xlc;*.xls)和All Files (*.*),大家可以看到每種檔案的副檔名規定都是一個字串對,例如Chart Files的過濾字串是Chart 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: Place dialog controls here.”靜態文字框,新增兩個編輯框,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顯示在儲存檔案對話方塊中選擇的檔案路徑。

       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.執行此程式,在結果對話方塊上點“開啟”按鈕,顯示開啟檔案對話方塊如下:

VS2010/MFC程式設計入門之十七(對話方塊:檔案對話方塊)

       點“儲存”按鈕後,顯示儲存檔案對話方塊:

VS2010/MFC程式設計入門之十七(對話方塊:檔案對話方塊)

       在開啟檔案對話方塊和儲存檔案對話方塊都選擇了檔案路徑後,主對話方塊如下:

VS2010/MFC程式設計入門之十七(對話方塊:檔案對話方塊)