【MFC-5】VS 2010プログラミングのファイルダイアログ

5142 ワード

一、開発環境
1、VS2010
2、C++/MFC
二、ファイルダイアログの分類
ファイルダイアログは、「ファイルを開く」ダイアログと「ファイルを保存する」ダイアログに分かれています.たとえば、多くの編集ソフトには手帳などの「開く」オプションがあり、「開く」を選択するとダイアログボックスがポップアップします.ファイルを開くパスを選択しましょう.このダイアログボックスはファイルを開くダイアログボックスです.[開く](Open)オプションに加えて、一般的には[名前を付けて保存](Save As)オプションもあります.[名前を付けて保存](Save As)を選択すると、ダイアログボックスがポップアップされます.ファイルを保存するダイアログボックスです.
前述したように、開くファイルのパスを選択するためにファイルダイアログボックスを開き、保存するファイルダイアログボックスを使用して保存するファイルのパスを選択します.
三、ファイルダイアログクラス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
);

パラメータの説明:
1)bOpenFileDialog:作成するファイルダイアログのタイプを指定します.TRUEがファイルを開くダイアログボックスを作成するように設定します.そうしないと、ファイルを保存するダイアログボックスが作成されます.2)lpszDefExt:デフォルトのファイル拡張子.ユーザーがファイル名編集ボックスに拡張子を入力しない場合、lpszDefExtで指定した拡張子は自動的にファイル名の後に追加されます.デフォルトはNULLです.3)lpszFileName:ファイル名編集ボックスに表示される初期ファイル名.NULLの場合、初期ファイル名は表示されません.4)dwFlags:ファイルダイアログボックスのプロパティ.1つの値でも複数の値の組み合わせでも構いません.属性値の定義については、MSDNで構造体OPENFILENAMEを検索できます.要素Flagsの説明には、すべての属性値が含まれています.デフォルトはOFN_HIDEREADONLYとOFN_OVERWRITEPROMPTの組み合わせ、OFN_HIDEREADONLYは、非表示ファイルダイアログボックスの「Read Only」チェックボックス、OFN_OVERWRITEPROMPTは、ファイルの保存ダイアログボックスで選択したファイルが存在する場合、このファイルを上書きするかどうかを確認するメッセージダイアログボックスを開きます.5)lpszFilter:複数の文字列ペアからなる文字列シーケンスであるファイルフィルタ.ファイルフィルタが指定されている場合は、ファイルダイアログボックスにフィルタ条件を満たすファイルのみがファイルリストに表示されます.
VS 2010 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(*.*)の4つのオプションがあり、各ファイルの拡張子規則は文字列ペアであることがわかります.例えば、Chart Filesのフィルタ文字列はChart Files(*.xlc)と*です.xlcペアが現れた.
pParentWnd:ファイルダイアログの親ウィンドウのポインタ.dwSize:OPENFILENAME構造体の大きさ.異なるオペレーティングシステムは、異なるdwSize値に対応します.MFCはこのパラメータでファイルダイアログの適切なタイプを決定します(例えば、Windows 2000ファイルダイアログの作成やXPファイルダイアログの作成など).デフォルトは0であり、MFCがプログラム実行のオペレーティングシステムバージョンに基づいてどのファイルダイアログボックスを使用するかを決定することを示す.bVistaStyle:ファイルダイアログのスタイルを指定し、TRUEに設定するとVistaスタイルのファイルダイアログが使用され、そうでない場合は古いバージョンのファイルダイアログが使用されます.このパラメータは、Windows Vistaでコンパイルする場合にのみ適用されます.ファイルダイアログもモダリティダイアログなので、開くときにCFIleDialogクラスのDoModal()メンバー関数を呼び出す必要があります.ファイルを開くダイアログボックスで[開く](Open)をクリックするか、ファイルを保存ダイアログボックスで[保存](Save)をクリックした後、CFIleDialogクラスのメンバー関数GetPathName()を使用して選択したファイルパスを取得できます.
四、CFIleDialogクラスのメンバー関数
以下にCFIleDialogクラスのメンバー関数をいくつかリストし、ファイルダイアログボックスのさまざまな選択を得ることができます.
1)GetFileExt():選択したファイルの接尾辞名を取得します.
2)GetFileName():接尾辞を含む選択したファイルの名前を取得します.
3)GetFileTitle():選択したファイルのタイトルを取得します.つまり、接尾辞名は含まれません.
4)GetFolderPath():選択したファイルのディレクトリを取得します.
5)GetNextPathName():次の選択したファイルのパスのフルネームを取得します.
6)GetPathName():選択したファイルのパスのフルネームを取得します.
7)GetReadOnlyPref():読み取り専用で開くかどうかを確認します.
8)GetStartPosition():ファイル名リストの最初の要素の場所を取得します.
五、ファイルダイアログの例
前に述べたように、鶏啄米はファイルダイアログの例を作ってあげます.
1、ダイアログベースのMFCアプリケーションエンジニアリングを作成し、名前を「Example」に設定する.
2、メインダイアログIDDの変更EXAMPLE_DIALOGのテンプレートは、自動的に生成される「TODO:Place dialog controls here.」を削除します.静的テキストボックス、2つの編集ボックスを追加し、IDはそれぞれIDC_である.OPEN_EDITとIDC_SAVE_EDIT、更に2つのボタンを追加して、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クリックメッセージのメッセージ処理関数CExampleDlg::OnBnClickedOpenButton()とCExampleDlg::OnBnClickedSaveButton()を追加します.
4、二つのメッセージ処理関数を以下のように修正する.
void CExampleDlg::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 CExampleDlg::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);   
    }   
}  

5、テスト
六、参考
         http://www.jizhuomi.com/software/173.html