最終更新 2003 10/09
サンプルのダウンロード → Exp_OpenDialog.lzh(36k)
全ソースコード
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 より大きい値は指定しないように
しましょう。
nMaxFileTitle は lpstrFileTitle に格納できる文字数(バイト数)を
指定します。
lpstrFileTitle で char filename[MAX_PATH]; と宣言した場合は
MAX_PATH を指定します。
構造体の値が設定できたら GetOpenFileName() 関数を使って
ダイアログボックスを開きます。
値が正しく設定できていればダイアログが開くはずです。
【サンプルについて】
OPENFILENAME 構造体はメンバ変数の数がやたら多い上に、普段は使用しない
ような値が多いので、自分で新しく OPENDIALOG という構造体を作って
それを利用しています。
ファイルを開くダイアログを表示する時には自作関数の ShowOpenDialog()
関数を使っています。
関数を呼び出す前に OPENDIALOG 構造体のメンバ変数に値を設定して、この
構造体のポインタを ShowOpenDialog() 関数に渡しています。
|