第7章 選択肢を与える(1)
2006年8月30日
いつも思うことだが、枠だけのWindowは、なにかがらんとしていて寂しい。
そこで、一般的なメニューバーとツールバー、ステータスバーを取付け彩りを添えることにした。
とりあえず、見た目だけでも・・・
 さて、まず左図のようなメニューを追加してみることに。
ひとつふたつではつまらないので、思いつく限りに並べてみようと思い、リストアップから始める。
こうしておけば、後で不要なものをコメントアウトするだけで済むし、ビルドした実行ファイルもクリックして遊ぶことも出来るし(?)。
しかし、メニュー項目ひとつひとつの機能を用意するのは面倒だったので、ファイルの終了だけ実行できるようにしてみた。
調子にのって項目を増やしたため、内容の割にソースが長いものになってしまった。
仕方が無いので、今回から別ウィンドウにてソースを確認していただきたいと思う。
こんなに長いのにプログラムの方はと云うと、前章のList.001-008からあまり変わりが無い。
なぜなら、もともとメニューの機能はWindow枠に備わっているもので、前回では使用しなかっただけのことだからである。
では、どのようにしてメニュー機能を使用するのか、と云うと・・・
window_class.lpszMenuName= "MAINMENU";
上記のように、関数WinMain()内でメニュー名を指定してやるだけである。
で、このメニュー名ってのはどこで定義しておくのかと云うと・・・
ファイル"main_menu.rc"の頭のあたりで書いた部分がそれ。
この"main_menu.rc"は、今回初めて紹介(?)することになったリソース定義ファイルである。
こいつは、C/C++言語のリファレンスをひっくり返しても出てこない。
なぜならC/C++言語とはまるで関係のないファイルだからである。(←非常に誤解されそうな表現)
リソース定義ファイルは、リソースコンパイラによってコンパイルされ、リンカによってアプリケーションにリンクされるようである。
しかし、中途半端にC/C++言語の表記に似ているのは何でだろう?
それはともかく、このリソースファイルで必要な項目を定義してやれば、メニュー項目の追加は終了。
実に簡単である。
因みに、今回説明っぽい文章が多いのは、簡単すぎて書くべき失敗談が無かったからである(つまんない)。
こうして追加したメニューの為に、今度は"main_callback.cpp"内に"WM_COMMAND"メッセージの処理を追加しよう。
このメッセージは、ユーザーがメニューをクリックしたりした時にOSから送られてくるもの(実はメニューとは限らない)で、今回のプログラムでは拙作であるところの関数SelectMenu()を呼出している。
そして"WM_COMMAND"メッセージとともに送られてくるwParamの値には、先の"main_menu.rc"で定義しておいたメニューIDが入ってくるので、関数SelectMenu()で区別して処理してやっている。
別に関数SelectMenu()なんて用意せずに、関数MainCallBack()内で直接処理してやっても良い。
さて、久しぶりに長々と書いたところでなんなんだが、メニューはとにかく簡単なので、深いこと考えずにサラッとコーディングして完成させれば良いぶぶんだと思う。
何せ、残りのツールバーとステータスバーは落とし穴ビシバシ(?)で大変苦労してしまうのだから。
|