多くの方から、.netでリソースの扱い方がわからない、という質問をいただいています。

メニューはリソースの中でも最も基本的なものです。ここではVC++.netでのメニューの作り方について解説します。




まずは、メニュー無しのウィンドウを作ります。これが、正常に動作することを確認したら ソリューション・エクスプローラを見てください。

ソリューション・エクスプローラを右クリックして、「追加」「新しい項目の追加」を選択します。



「新しい項目の追加」ダイアログで、テンプレート(T)に「リソースファイル(rc)」を選択します。

リソースファイルのファイル名を入力します。プロジェクト名と同じにしておくと便利です。(ここではresource01)

ファイル名の拡張子(rc)は入力する必要はありません。



リソースビューを右クリックして「リソースの追加(A)...」を選択します。



「リソースの追加」ダイアログで「Menu」を選択して「新規作成(N)」ボタンを押します。



自動的にメニューのIDがIDR_MENU1と付けられたはずです。

プロパティウィンドウで、このID項目を選択します。



IDR_MENU1をダブルクォーテーション付きの「MYMENU」に変更します。

注:もちろんダブルクォーテーション無しのIDのままでも良いのですが、後の作業が少し変わってきます。



メニューエディタでメニューを作ります。

「ファイル(&F)」をクリックしてもコマンドは実行されません。その代りサブメニューが出てきます。(「&」の次に付く文字に下線がついて「&」の文字そのものは表示されません。) このようなメニュー項目をPopup項目といいます。プロパティウィンドウの「表示」「Popup」はTrueとなっているはずです。

「ファイル」の下に「終了(&X)」というメニュー項目を作ります。これは、このコマンドが実行されるのでPopupはFalseになっているはずです。



PopupがFalseである項目にはIDを付けなくてはいけません。ここでは、わかりやすいように 「IDM_END」としました。メニュー項目には「IDM_何とか」というIDにするとわかりやすいです。



ソース・ファイルにresource.hをインクルードします。

リソース・エディタが自動的に作るヘッダファイルの名前は必ずresource.hになっています。 これには、先ほどのIDM_ENDに適当な数値が割り振られています。



WNDCLASSEX構造体のlpszMenuNameメンバに、メニュー名("MYMENU")を指定します。

もし、メニュー名をIDR_MENU1のままにしていた場合は、MAKEINTRESOURCEマクロを利用してください。

これで、ビルドするとメニュー付きのウィンドウができあがりです。しかし、メニューをクリックしても何も起りません。メニューでIDM_ENDが選択された時の処理をプログラムに書いていないからですね。



メインウィンドウのプロシージャに、メニュー項目が選択された時の処理を書き込みます。

メニューが選択されるとWM_COMMANDメッセージが来ます。この時WPARAM値の下位WORD値がメニュー項目のIDとなります。

左のプログラムでは、メニューのIDM_ENDが選択された時、自分自身にWM_CLOSEメッセージを出しています。



あとは、どんどんメニュー項目を追加していって、それぞれの処理を書き込むだけです。

別のリソースを追加する時は、リソースビューを右クリックして「リソースの追加」を選択します。 一つのプロジェクトにリソース・スクリプトは一つしか持てないことに注意してください。


[総合INDEX]
04/Apr/2004 By Y.Kumei