さて、前回までで、Window を作ってその中に Graphic Primitives を表示すること、 また Window が消されたらプログラムを終了させることができるようになりました。 多くの Window Program では、メニューバーを持っており、メニュー項目を 選ぶことにより、ファイルの選択や プログラムの実行・停止の指示、また各種パラメータの設定などを行えるように なっています。 ここでは、Window Program にメニューバーを付けることを行いましょう。
メニューバーなどは、通常 Resource editor を使って Resource File (*.rc) を 作成・編集し、Resource Compiler (rc) でコンパイルします。 これと、C/C++ でコンパイルされたモジュールをリンクすることで メニューバーのある program を作ります。
ここでは、メニューバーに "File" という項目があり、その項目をクリック すると、"Command" という項目と "Exit" という項目が分離線で分離されて現れる ようなメニューを考えましょう。ただし、Resource editor の使い方は述べません。 Resource File そのものは、普通のテキストファイルですので、 メモ帳などを使って作成・編集することも可能です。
まず、"Command" や "Exit" に対応した ID 番号を決める必要があります。 Resource File 中の、これらの ID が 前回の WndProc に渡されます。 従って、これらは複数のファイルに共通の値として使われることになるので、 resource.h などの名前のヘッダファイルとして別に用意するのが 普通です。例えば今の場合、ヘッダファイル resource.h には
#define ID_FILE_EXIT 10001 #define ID_FILE_CMND 10002と書きます。この数値は 16bit の範囲で重複しない限り任意につけられます。 Resource Editor などでは、これらは自動的に生成されます。
メニューは上で述べたように、Resource File (*.rc) として書きます。 大事なことは、メニューには(他の Resource もそうですが)名前を付けることが できるということです。ここではその名前として "MyMenu" という名前を つけるものとしましょう。この場合は、
#include "resource.h" MyMenu MENU DISCARDABLE BEGIN POPUP "File" BEGIN MENUITEM "Command", ID_FILE_CMND MENUITEM SEPARATOR MENUITEM "Exit", ID_FILE_EXIT END ENDとなります。C/C++ で書かれたプログラムで、このメニューを使うには、 メニューにつけた名前 "MyMenu" で参照します。
ここでは簡単のため、メニューバーはプログラム実行中ずっと同じであると します。これを実現するには Window Class の登録 の際に行ってしまうのが 簡単です。具体的には、WinMain の例 のところで WNDCLASS構造体を設定している部分の
wc.lpszMenuName = 0;を
wc.lpszMenuName = "MyMenu";とするだけです。これでメニューバーが表示されるようになります。
Resource Editor などを使って、Menu を ID (例えば ID_MY_MENU とします) で扱いたい場合は、
wc.lpszMenuName = MAKEINTRESOURCE( ID_MY_MENU );のように、MAKEINTRESOURCEマクロを使用します。
ユーザがメニュー項目を選択したことが、どうやって C/C++ のプログラムに 伝えられるのかは次回で述べます。とりあえず、 ここまででメニューだけは現れます。"File" メニューを選択すると、 "Command" と "Exit" のメニューが分離線の上下に現れます。まだ、 これらのメッセージを処理する部分がないので、それ以上選択 しても何事も起こりません。