ファイルを開くコモンダイアログを使う

最終更新 2003 10/09

サンプルのダウンロード → Exp_OpenDialog.lzh(36k)

サンプルプログラムのスクリーンショット1

サンプルプログラムのスクリーンショット2 サンプルプログラムのスクリーンショット3

全ソースコード



GetOpenFileName 関数
        
    対応しているバージョン
    95, 98, Me, NT3.1以降, CE1.0以降, 2000, XP
            
    必要なヘッダとライブラリ
    commdlg.h
    comdlg32.lib
【必要なこと】
ファイルを開くダイアログボックスを使用するには commdlg.h を インクルードします。 ライブラリは comdlg32.lib が必要ですが、VC++の場合は初期状態で このライブラリを読み込むように設定されているので、設定し直す必要は ないと思います。 サンプルでは念のため、#pragma comment( lib, "comdlg32.lib" ) と やって comdlg32.lib を読み込んでいます。 #pragma comment( lib, "ライブラリファイル名" ) と書くと "ライブラリファイル名" で指定したライブラリを読み込んでくれるので VC++のメニューの [プロジェクト(P)] - [設定(S)] - リンク でライブラリファイルを指定する必要がなくなって便利です。 #pragma comment() の最後に ; をつけないようにしましょう。
【ダイアログボックスの表示】
ファイルを開くダイアログボックスを表示するには GetOpenFileName() 関数を使います。 引数には OPENFILENAME という構造体のポインタを指定するように なっているので OPENFILENAME ofn; こんな感じで宣言した後、メンバ 変数に必要な情報をセットします。
【ダイアログボックスの設定】
OPENFILENAMEで特に重要なメンバ変数は lpstrFile 選択されたファイルの絶対パスを格納する 配列のポインタ lpstrFileTitle 選択されたファイルののパスを含まない ファイル名を格納する配列のポインタ lpstrFilter 選択できるファイルのフィルター nMaxFile lpstrFile に格納できる文字数 nMaxFileTitle lpstrTitle に格納できる文字数 lStructSize 構造体のサイズ この6つです。 この6つの値を正しく設定しないとダイアログボックスが開いて くれません。 他のメンバ変数は、必要がなければ変数の型に応じて 0 か NULL を 指定しておけば問題ないと思います。 lpstrFile には、選択されたファイルの絶対パスを格納するための char 型配列のポインタ(配列の先頭アドレス)を指定します。 この値をセットするまえにあらかじめ char path[MAX_PATH + MAX_PATH]; というように char 型の配列を宣言しておきます。 配列のサイズは MAX_PATH より大きいサイズを指定します。 ここではとりあえず、MAX_PATH 2つ分のサイズを指定しています。 MAX_PATH はあらかじめ定義されているマクロです。 もともとは stdlib.h に定義されているのですが、windows.h を インクルードすれば使えます。 このマクロには、指定できるパスの最大文字数が定義されています。 たぶん Win95 以上なら 256 だと思います。 注意することは、char path[MAX_PATH + MAX_PATH]; の変数の値は かならず 0 (正確には '\0') で初期化します。 値を 0 で初期化するには memset() を使ってもよいですが どうせウィンドウズでしか動かないプログラムですから ZeroMemory() を使えば、多少は楽ですかね・・・。 lpstrFileTitle には、選択されたファイルのパスを含まない ファイル名を格納する配列のポインタ(配列の先頭アドレス)を 指定します。 lpstrFile と同じように値をセットする前に char filename[MAX_PATH]; こんな感じで文字列を格納するための 配列を宣言して ZeroMemory( filename, sizeof( filename ) ); こんな感じで配列の値を 0 で初期化しておきます。 lpstrFilter は、開くファイルの種類を選ぶためのフィルターと いうものを指定します。 ファイルを開くダイアログボックスの下のほうに、ファイルの種類を 選ぶコンボボックスがありますが、そこに入ってる 「すべてのファイル(*.*)」とか「ビットマップ(*.bmp)」とかの ことです。 以下に例を書きます。 "ビットマップ(*.bmp)\0*.bmp\0すべてのファイル(*.*)\0*.*\0\0" こんな風になります。 "表示する文字1\0対応する拡張子1\0表示する文字2\0対応する拡張子2\0・・・・\0" コンボボックスに表示させる文字を書いて、\0 で区切って、対応する 拡張子を書いて \0 で区切るという繰り返しになっています。 最後には終わりの目印として、もうひとつ \0 をつけます。 nMaxFile には lpstrFile に格納できる文字数(バイト数)を 指定します。 lpstrFile に値をセットするときに char path[MAX_PATH + MAX_PATH] という配列を宣言しましたが、この配列と同じサイズ MAX_PATH + MAX_PATH を指定すればよいと思います。 間違っても MAX_PATH + MAX_PATH より大きい値は指定しないように しましょう。 nMaxFileTitlelpstrFileTitle に格納できる文字数(バイト数)を 指定します。 lpstrFileTitle で char filename[MAX_PATH]; と宣言した場合は MAX_PATH を指定します。 構造体の値が設定できたら GetOpenFileName() 関数を使って ダイアログボックスを開きます。 値が正しく設定できていればダイアログが開くはずです。
【サンプルについて】
OPENFILENAME 構造体はメンバ変数の数がやたら多い上に、普段は使用しない ような値が多いので、自分で新しく OPENDIALOG という構造体を作って それを利用しています。 ファイルを開くダイアログを表示する時には自作関数の ShowOpenDialog() 関数を使っています。 関数を呼び出す前に OPENDIALOG 構造体のメンバ変数に値を設定して、この 構造体のポインタを ShowOpenDialog() 関数に渡しています。

| home |