素人プログラマーの日常

効率の良いコード、美しいコードなんて書けません。

GetOpenFileName()関数

「ファイルの列挙」であちこち検索してみましたが、どうもわからない。勉強不足です。クラスがどうとか、イテレーターがどうとかいう話になりますが、そのあたりの理解も浅いので、コードを見てもさっぱりです。掲載されているコードをそのままコピペして実行しても弾かれてしまいますし、どこをどういじったら良いかもわかりません。まずはそこから勉強しないといけないかな~と思っていたら、都合の良い関数を見つけました。

GetOpenFileName()関数です。

これを使えばファイル選択のダイアログが出てくれるので、自分でファイルを探索するプログラムを組まなくても済みます。この関数に必要なOPENFILENAME構造体のメンバは多いものの、拘らなければ簡単な設定で使えそうです。インクルードするヘッダも<windows.h>だけなのも魅力。

そういや<windows.h>ってウインドウズプログラムの基本ですから Dxlib.h の中でもインクルードしているはず。と思って確認してみると、やっぱり入ってました。ついでといってはなんですけども stdio.h も入っていたんですね。って自分でインクルードするファイルの中身も知らずに使っています(笑。

「それがオブジェクト指向というものか?」とかなんとか考えながら、今度は GetOpenFileName()関数について調べます。ふむふむ、大事なところはファイル名を含むパスとそれを格納するバッファのサイズ・ファイルのフィルタ・目的に合わせたフラグ、くらいでしょうか。他は0("null")で初期化。初期化すると困りそうなのは構造体のサイズなので、そこも追加。

【OPENFILENAME構造体主要メンバ】
DWORD    lStructSize    //構造体のサイズ
LPTSTR    lpstrFile    //パス付きファイル名
DWORD    nMaxFile    //パスを格納するバッファのサイズ
LPCTSTR    lpstrFilter    //フィルタ
DWORD    Flags    //フラグ



この単なる記号のような型はどうにかならなかったんですかね~。元の構造体で宣言しているので、型を記述せずに使えますが、型の意味を理解していないと使い方によっては誤爆することもあります。なのでもうちょっと種類を減らすなり判別しやすい名前にしてくれると好いんですけどね~。このへんもウインドウズプログラムをややこしくしているところです。



画像ファイルの選択には、とりあえずこの GetOpenFileName()関数を使って進めていく予定です。・・・調べてダイアログが出ることを確認しただけなので、どうファイル名を受け渡すかがよくわかっていません。まさか returnでファイル名を返して、そのまま画像をロードする関数の引数にぶち込むなんてことは出来ない・・・ですよね~。←笑うところです。