1. 程式人生 > >MFC——建立檔案對話方塊

MFC——建立檔案對話方塊

1 建立檔案對話方塊

2.1  檔案對話方塊類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類的成員函式,我們可以使用它們獲得檔案對話方塊中的各種選擇。

GetFileExt():獲得選定檔案的字尾名。
GetFileName():獲得選定檔案的名稱,包括字尾名。
GetFileTitle():獲得選定檔案的標題,即不包括字尾名。
GetFolderPath():獲得選定檔案的目錄。
GetNextPathName():獲得下一個選定的檔案的路徑全名。
GetPathName():獲得選定檔案的路徑全名。
GetReadOnlyPref():獲得是否“以只讀方式開啟”。
GetStartPosition():獲得檔名列表中的第一個元素的位置。

2.2例子

修改兩個訊息處理函式

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);   

    }   

}