コモンダイアログボックスを使ってみる

Windows には、コモンダイアログというものが用意されています。これは、ファイル名や色を選ぶための「メニュー」のようなもので、アプリケーション使用中に何度も目にした事があるでしょう。プログラムを書く時にはこのコモンダイアログを使う事で、対話的な処理を簡単に実現する事ができます。
今回は、コモンダイアログの中でも最も使う機会が多い「ファイルを開く」 ダイアログを使ってみました。

「ファイルを開く」ダイアログの使い方

「ファイルを開く」ダイアログをつかうためには、まずOPENFILENAME構造体を作成してそこで各種の設定をします。

OPENFILENAME構造体
typedef struct tagOFN { // ofn DWORD lStructSize; HWND hwndOwner; HINSTANCE hInstance; LPCTSTR lpstrFilter; LPTSTR lpstrCustomFilter; DWORD nMaxCustFilter; DWORD nFilterIndex; LPTSTR lpstrFile; DWORD nMaxFile; LPTSTR lpstrFileTitle; DWORD nMaxFileTitle; LPCTSTR lpstrInitialDir; LPCTSTR lpstrTitle; DWORD Flags; WORD nFileOffset; WORD nFileExtension; LPCTSTR lpstrDefExt; DWORD lCustData; LPOFNHOOKPROC lpfnHook; LPCTSTR lpTemplateName; } OPENFILENAME;

やけにたくさん変数がありますが、とりあえずダイアログを出してファイルを選択するだけなら、ファイル名のバッファとフィルター関連の設定だけをして、あとは0でうめておいても大丈夫でしょう。
選択されたファイル名(ドライブやパス名付)を取得するためのバッファはlpstrFile に指定します。nMaxFile はバッファのサイズです。また、lpstrFileTitleにはファイル名のみが入るようです。フィルターとは、ファイルの種類を選ぶために「ビットマップ(*.bmp)」という感じで表示されるやつで、文字列で設定してください。
指定方法は、表示用の文字列と実際にフィルターにかけるファイルの拡張子を文字列として(つまり最後はNULL)順番に並べ、最後にNULLを2つおきます。
例えば、

ofn.lpstrFilter="テキスト(*.txt)\0*.txt\0すべてのファイル(*.*)\0*.*\0\0";

とすれば、「テキスト(*.txt)」「すべてのファイル(*.*)」と表示されて*.txt、*.* というフィルターが適用されるわけです。ちなみにこのフィルターの初期位置はnFilterIndexで指定できますから(最初のフィルターが1なので注意)、この値を2にすると最初にフィルターとして「すべてのファイル(*.*)」が表示されます。

また、ダイアログのタイトルを変更したい時は、lpstrTitleに文字列を設定してください。

・設定例
  ofn.lStructSize=sizeof(OPENFILENAME);
  ofn.hwndOwner=hwnd;
  ofn.hInstance=NULL;
  ofn.lpstrFilter= // フィルター
    "テキスト(*.txt)\0*.txt\0すべてのファイル(*.*)\0*.*\0\0";
  ofn.lpstrCustomFilter=NULL;
  ofn.nMaxCustFilter=0;
  ofn.nFilterIndex=1; // フィルターの初期位置
  ofn.lpstrFile=szFn; // ファイル名用文字列バッファ
  ofn.nMaxFile=255;  // 文字列バッファのサイズ
  ofn.lpstrFileTitle=szFt; // ファイルのタイトル用文字列バッファ
  ofn.nMaxFileTitle=255; // 文字列バッファのサイズ
  ofn.lpstrInitialDir=NULL;
  ofn.lpstrTitle="コモンダイアログテスト"; // タイトル
  ofn.Flags=OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
  ofn.nFileOffset=0;
  ofn.nFileExtension=0;
  ofn.lpstrDefExt=NULL;
  ofn.lCustData=0;
  ofn.lpfnHook=NULL;
  ofn.lpTemplateName=NULL;

フラグで指定した数値の意味は、OFN_FILEMUSTEXISTが存在しないファイルを選べなくする(選ぶとエラーを表示)もので、OFN_HIDEREADONLY が「読み取り専用ファイルとして開く」のチェックを表示しないようにするものです。
lpstrInitialDir は初期ディレクトリですがNULLを指定するとカレントディレクトリが初期ディレクトリになります。

実際に「ファイルを開く」ダイアログを表示するには、この構造体のアドレスを引数としてGetOpenFileNameを呼び出してください。この関数は、エラーを起こしたりファイルが選択されずにダイアログが閉じられると、FALSE(0)を返します。また、選択されたファイル名はlpstrFileで指定したバッファに入っています。

プログラム

プログラムソース表示

今回のプログラムは、ボタンをクリックすると「ファイルを開く」ダイアログを出します。さらにファイルが選択されると、そのファイルの大きさを調べ、メッセージボックスで選択されたファイル名とサイズを表示するようにしました。
メッセージボックスのタイトルは、lpstrFileTitleに入っているファイルのタイトルをそのまま表示しています。


プログラミング資料庫 > Windowsプログラミング研究室