ファイル操作用・コモンダイアログを使う


 Windows用アプリケーションでお馴染みの[ファイルを開く]、[ファイル名を付けて保存]などの
操作を行う場合に使用されるコモンダイアログは「CFileDialogクラス」を使用します。
 以下に、その概要を記述します。

【生成書式】
 CFileDialog(BOOL bOpenFileDialog,                                    //種類
       LPCTSTR lpszDefExt = NULL,                               //拡張子
       LPCTSTR lpszFileName = NULL,                             //初期ファイル名
       DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,  //フラグ
              LPCTSTR lpszFilter = NULL,                //フィルタ
       CWnd* pParentWnd = NULL);                //親ウィンドウ

 bOpenFileDialog:
    ダイアログボックスの種類を指定します。
    TRUE:[ファイルを開く] FALSE:[ファイル名を付けて保存]

 lpszDefExt:
    デフォルトのファイル拡張子。
    これは、拡張子を付けずにファイル名を入力したときに自動的に付加される拡張子です。
    また、指定がNULLならば拡張子は付加されません。

 lpszFileName:
    エディットボックスに初期表示されるファイル名。
    指定がNULLなら何も表示されません。

 dwFlags:
    ダイアログをカスタマイズするためのフラグ。
    複数のフラグをOR演算子により組み合わせることによりカスタマイズの幅が広がります。
    これは後で説明するデータメンバm_ofnのフラグと同等のものです。

 lpszFilter:
    候補表示されるファイルの種類を限定するためのフィルタを指定。

 pParentWnd:
    ダイアログボックスの親ウィンドウ、オーナーウィンドウへのポインタ。
    NULLを指定すれば所定の親ウィンドウになる。
    自分自身を指定したい場合はthisポインタを使えばよい。

【ファイル名の取得】
 ダイアログボックスで選択されたファイル名は次の方法で取得します。
 説明のために、
     CFileDialog myDLG(・・・・・)
 とクラスが生成されたとします。

 myDLG.GetPathName();      //フルパス名
 myDLG.GetFileName();      //ファイル名
 myDLG.GetFileTitle();     //拡張子無しのファイル名(主ファイル名)
 myDLG.GetFileExr();       //拡張子名

【表示ファイルの限定】
 lpszFilterにファイルタイプを表す文字列を設定することにより実現できます。

 記述ルール:
    表示部|種類
        例)
     テキスト(*.txt)|*.txt

 複数タイプ記述ルール:
    表示部@|種類@|表示部A|種類A||
    例)
     テキスト(*.txt)|*.txt|ソース(*.cpp)|*.cpp|すべて(*.*)|*.*||

【代表的なdwFlagsフラグ】
 代表的なdwFlagsフラグを示します。

 OFN_OVERWRITEPROMPT    :  すでにファイルが存在する時、上書きするかどうかを問う
  OFN_CREATEPROMPT    :  指定ファイルが存在しない時、新規作成するかどうかを問う
  OFN_FILEMUSTEXIST   :  存在するファイル名しか入力できないようにする
  OFN_READONLY      :  「読み取り専用ファイルとして開く(R)」を最初からオンにする
  OFN_HIDEREADONLY    :  「読み取り専用ファイルとして開く(R)」を表示しない

【ダイアログボックスの外観】
 データメンバ m_ofnを設定することにより、ダイアログボックスの外観を変更できます。
  (注)m_ofnはダイアログボックスを表示する前に設定して下さい。

 ●m_ofnのデータ型
  m_ofnはOPENFILENAME型の構造体です。以下に、その構造体の構成を示します。

  「OPENFILENAME構造体」
   typedef struct tagOFN {                     //ofn 
       DWORD         lStructSize;       //構造体のサイズ(単位:Byte)
       HWND          hwndOwner;            //親ウィンドウのハンドル
       HINSTANCE     hInstance;            //インスタンスハンドル
       LPCTSTR       lpstrFilter;          //フィルタ
       LPTSTR        lpstrCustomFilter;    //保存されるフィルタ
       DWORD         nMaxCustFilter;       //lpstrCustomFilterのサイズ
       DWORD         nFilterIndex;         //最初に使用されるフィルタ
       LPTSTR        lpstrFile;            //ファイルのフルパス名
       DWORD         nMaxFile;             //lpstrFileのサイズ
       LPTSTR        lpstrFileTitle;       //ファイルのタイトル
       DWORD         nMaxFileTitle;        //lpstrFileTitleのサイズ
       LPCTSTR       lpstrInitialDir;      //初期ディレクトリ
       LPCTSTR       lpstrTitle;           //タイトルバーの文字列
       DWORD         Flags;                //修飾フラグ
       WORD          nFileOffset;          //lpstrFileのファイル名先頭文字位置(0〜)
       WORD          nFileExtension;       //lpstrFileの拡張子先頭文字位置(0〜)
       LPCTSTR       lpstrDefExt;          //拡張子のデフォルト
       DWORD         lCustData;            //アプリケーションの定義データ
       LPOFNHOOKPROC lpfnHook;             //フック関数のポインタ
       LPCTSTR       lpTemplateName;       //ダイアログボックスの名前
   } OPENFILENAME;