読者です 読者をやめる 読者になる 読者になる

ファイルの選択ダイアログ

アプリケーションでファイルを選択するダイアログが出てきますが、これを自分のコードでも書いてファイルを指定したいですよね?(僕だけか??)

このダイアログを出すためにはGetOpenFileName()関数を使います。

BOOL GetOpenFileName(LPOPENFILENAME lpofn);

lpofnには、初期化情報を格納したOPENFILENAME構造体へのポインタを指定します。
ユーザがファイルを選択すれば0以外、そうでなければ0が返ります。

OPENFILENAME構造体は次のような定義になっています。

typedef struct tagOFN {
    DWORD         IStructSize;
    HWND          hwndOwner;
    HINSTANCE     hInstance;
    LPCTSTR       lpstrFilter;
    LPTSTR        lpstrCustumFilter;
    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;
  • lStructSizeにはこの構造体のサイズを指定します
  • hnwdOwnerは、ダイアログボックスの親ウィンドウのハンドルを指定します
  • hInstanceは、ダイアログボックステンプレートを用いる場合にテンプレートを含むモジュールのインスタンスハンドルを指定します
  • lpstrFilterには、選択対象のファイルをフィルタリングするための文字列を指定します。この文字列は、表示文字列\0フィルタ文字列という形で指定します。表示文字列はダイアログのリストボックスに表示される文字列でフィルタ文字列は、フィルタパターンを指定します。例えば、"Text(*.txt)\0*.txt"とすれば、拡張子がtxtのファイルのみが表示されます。
  • lpstrCustomFilterは、ユーザ定義のフィルタ文字列バッファへのポインタを指定します。これはlpstrFilter同様に表示文字列とフィルタ文字列の組み合わせです。システムは選択されたフィルタパターンをこのバッファに保存します。表示文字列は変わりませんが、フィルタは最後に保存されたものになっている。
  • nMaxCustFilterには、lpstrCustomFilterのバッファサイズを指定します。この長さは最低でも40文字分以上のサイズを指定しなければなりません。lpstrCustomFilterがNULLの場合は無視されます。
  • nFilterIndexには、ダイアログの初期設定のフィルタインデックスを指定します。0を指定すれば、ユーザ定義のカスタムフィルタを表します。
  • lpstrFileは、ファイル名が格納される256文字以上のバッファへのポインタを指定します。このバッファに、選択されたファイルの降るパスが格納されます。
  • nMaxFileにはlpstrFileが指すバッファサイズを指定します。
  • lpstrFileTitleには、ファイルタイトルを格納するバッファへのポインタを指定します。ファイルタイトルとは、ドライブ名とディレクトリ名をの除いた、ファイル自体の名前です。必要ないときはNULLを選択してください。
  • nMaxFileTitleには、lpstrFileTitleが指すバッファサイズを指定します。
  • lpstrInitialDirは、初期のファイルでぃれえくとりを表す文字列のポインタを指定します。このメンバがNULLの場合、選択ダイアログはカレントディレクトリを表示します。
  • lpstrTitleには、ダイアログのタイトルバーに表示する文字列を指定します。NULLを指定すれば、デフォルトの文字がタイトルバーに表示されます。
  • Flagsはダイアログ作成のフラグを指定します。
  • nFileOffsetはlpstrFileが指す文字列内におけるパスの先頭からファイル名までの0から数えたオフセットを表します。
  • nFileExtensionは、lpstrFileが指す文字列内におけるパスの先頭からファイル名拡張しまでの0から数えたオフセットを表します。
  • lpstrDetExtには、デフォルトの拡張子を表す文字列へのポインタを指します。ユーザが拡張子を入力しなかった場合、この拡張子が用いられます。
  • lCustDataはフック関数に渡す追加データを指定します。
  • lpfnHookには、フック関数へのポインタを指定します。
  • lpTemplateNameは、ダイアログテンプレートを使用する場合に、テンプレート名を指定します。