GetOpenFileName

WindowsAPI(Win32API) Advent Calendar 2015 3日目
WindowsAPI(Win32API) Advent Calendar 2015 - Adventar

GetOpenFileNameは、"ファイルを開く"というタイプのファイル選択ダイアログを表示するWindowsAPI・・・。

GetOpenFileName 関数

OPENFILENAME構造体変数にパラメータをセットして、アドレスをこの関数に渡すと、"ファイルを開く"ダイアログが出て、ファイルを選べる・・・。
ファイルを選択したら、lpstrFileメンバにファイルパス文字列セットされるので、後はCreateFileなどでファイルを開いて表示することができる・・・。

resource.hに、

GetOpenFileName.rcに、

メニュー項目Open(ID_FILE_OPEN)とエディットボックスのリソースID(ID_EDIT1)を用意しておく・・・。
エディットボックスは前回のように、

CreateWindowで作って、そこにID_EDIT1をセット・・・。

WM_SIZEも、

前回と同じ・・・。

Openが選択された時、

まず、OPENFILENAME構造体変数ofnに値をセット・・・。
ofnやtszFilePathは{0}で初期化しておくこと・・・。
lpstrFilterは、表示するファイルをワイルドカードでフィルタリングするあれ・・・。
"\0"区切りでフィルタリストを指定する・・・。
拡張子がtxtなら"*.txt"、全てのファイルなら"*.*"・・・。
最後のところは"\0\0"とする・・・。
FlagsのOFN_FILEMUSTEXISTは、選択したファイルが存在しない場合にメッセージが出て、選択が無効になり、ファイル選択ダイアログが表示されたままの状態になる・・・。

GetOpenFileNameにofnを渡す・・・。
キャンセルを押したり、閉じたりするとFALSEが返るので、そういう場合はそこで処理を終わりにしてしまう・・・。

lpstrFileにはtszFilePathのアドレスを渡していると思うが、そのtszFilePathに選択したファイルパスが格納されるので、あとはそのパスのファイルを開いて、読み込んで、エディットボックスにセット・・・。
これでちょっとしたテキストエディタの"ファイルを開く"部分はできた・・・。

f:id:BG1:20151203114407p:plain

こんなtest.txtだとして、

f:id:BG1:20151203114428p:plain

最初この状態・・・。

f:id:BG1:20151203114449p:plain

メニュー項目Openを選択・・・。

f:id:BG1:20151203114738p:plain

"開く"ダイアログが出る・・・。

f:id:BG1:20151203114904p:plain

test.txtを選択・・・。

f:id:BG1:20151203114921p:plain

エディットボックスに中身が表示された・・・。

Sample/GetOpenFileName.cpp at master · bg1bgst333/Sample · GitHub
Sample/resource.h at master · bg1bgst333/Sample · GitHub
Sample/GetOpenFileName.rc at master · bg1bgst333/Sample · GitHub