>> WINAPI入門トップに戻る
今回はメニューの作成について説明します。
メニューバーを作成するにはメニューバー専用の構文に基づいて、
コードを書き、それをリソーススクリプトとして取り込み、
WNDCLASS構造体のlpszMenuNameメンバに該当メニューの名前を指定することで
メニューが作成できます。
構文は以下の通りです。
ユニーク文字列 MENU {
POPUP "親メニューの名前" {
MENUITEM "子メニューの名前",メニューID
}
}
と書きます。
ユニーク文字列はユニークであればどんな文字列でも構いません。
またユニーク文字列は数値を指定しても構いません。
メニューIDにはユニークな数値を指定します。
popupの隣に指定する文字列がメニューで言うと親メニューの名前になり、
MENUITEMの隣に指定する文字列がその下にぶら下がる子メニューの名前になります。
この構文に従って作成したファイルを、
リソーススクリプトとして登録する必要があります。
vc++でリソーススクリプトとしてファイルを作成するには、
ソリューションエクスプローラからリソースファイル→右クリック→追加→新しい項目を選択し、
拡張子をrcにして好きな名前でファイルを作成します。
作成されたファイルを選択→右クリック→コードを表示、とすることで
リソースファイルが編集できるようになります。
この中に上記の構文に従ったメニューを構成するコードを書きます。
下記のコードを見てください。
●リソーススクリプト
●ソースファイル
これを実行すると以下のような画面が表示されます。

リソーススクリプトでdefine.hをインクルードしていますが、
そのdefine.hで子メニューのIDを定義しています。
上記で説明したとおり、POPUPで指定した名前が親メニュー名となり、
MENUITEMで指定した名前が子メニューの名前になっています。
また該当の子メニューを選択すると、ウィンドウプロシージャにWM_COMMANDメッセージが
送信されます。
そのWPARAMの下位ワードには子メニューのIDが入っています。
メニュー構文でMENUITEMの行の一番右端に書いたIDのことです。
上記のコードではその値をチェックして、子メニューに応じたメッセージを出力するようにしています。
メニューバーの作成についての説明は以上です。
次回はタイマーについて説明します。
>> 【タイマー】に進む
>> WINAPI入門トップに戻る
メニューバーの作成
メニューバーを作成するにはメニューバー専用の構文に基づいて、
コードを書き、それをリソーススクリプトとして取り込み、
WNDCLASS構造体のlpszMenuNameメンバに該当メニューの名前を指定することで
メニューが作成できます。
構文は以下の通りです。
ユニーク文字列 MENU {
POPUP "親メニューの名前" {
MENUITEM "子メニューの名前",メニューID
}
}
と書きます。
ユニーク文字列はユニークであればどんな文字列でも構いません。
またユニーク文字列は数値を指定しても構いません。
メニューIDにはユニークな数値を指定します。
popupの隣に指定する文字列がメニューで言うと親メニューの名前になり、
MENUITEMの隣に指定する文字列がその下にぶら下がる子メニューの名前になります。
この構文に従って作成したファイルを、
リソーススクリプトとして登録する必要があります。
vc++でリソーススクリプトとしてファイルを作成するには、
ソリューションエクスプローラからリソースファイル→右クリック→追加→新しい項目を選択し、
拡張子をrcにして好きな名前でファイルを作成します。
作成されたファイルを選択→右クリック→コードを表示、とすることで
リソースファイルが編集できるようになります。
この中に上記の構文に従ったメニューを構成するコードを書きます。
下記のコードを見てください。
●リソーススクリプト
#include "define.h"
MENUID MENU {
POPUP "ファイル" {
MENUITEM "開く" , MENU_ITEM1
MENUITEM "閉じる" , MENU_ITEM2
}
POPUP "表示" {
MENUITEM "設定", MENU_ITEM3
MENUITEM "オプション" , MENU_ITEM4
}
}
●ソースファイル
#include <windows.h>
#include "define.h"
#define MSG(m) {\
MessageBoxA(NULL,m,NULL,MB_OK);}
//ウィンドウハンドル
HWND hwnd;
//インスタンスハンドル
HINSTANCE hinst;
//ウィンドウ横幅
#define WIDTH 500
#define HEIGHT 300
LRESULT CALLBACK WinProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp)
{
switch(msg){
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_COMMAND:
switch(LOWORD(wp)){
case MENU_ITEM1:
MSG("開くが選択されました");
return 0;
case MENU_ITEM2:
MSG("閉じるが選択されました");
return 0;
case MENU_ITEM3:
MSG("設定が選択されました");
return 0;
case MENU_ITEM4:
MSG("オプションが選択されました");
return 0;
}
break;
}
return DefWindowProc(hwnd,msg,wp,lp);
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
MSG msg;
WNDCLASS wc;
wc.style=CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc=WinProc;
wc.cbClsExtra=wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hCursor=wc.hIcon=NULL;
wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wc.lpszClassName="test";
wc.lpszMenuName="MENUID";
if(!RegisterClass(&wc)){
MSG("クラスの登録失敗");
return -1;
}
hwnd=CreateWindowA("test","テストウィンドウ",WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
0,0,400,400,NULL,NULL,hInstance,NULL);
if(hwnd==NULL){
MSG("ウィンドウ作成失敗");
return -1;
}
//インスタンスハンドル
hinst=hInstance;
//エラーチェック用変数
int check;
while(check=GetMessage(&msg,NULL,0,0)){
if(check==-1){
break;
}
DispatchMessage(&msg);
}
//クラス解放
UnregisterClass("test",hinst);
return 0;
}
これを実行すると以下のような画面が表示されます。

リソーススクリプトでdefine.hをインクルードしていますが、
そのdefine.hで子メニューのIDを定義しています。
上記で説明したとおり、POPUPで指定した名前が親メニュー名となり、
MENUITEMで指定した名前が子メニューの名前になっています。
また該当の子メニューを選択すると、ウィンドウプロシージャにWM_COMMANDメッセージが
送信されます。
そのWPARAMの下位ワードには子メニューのIDが入っています。
メニュー構文でMENUITEMの行の一番右端に書いたIDのことです。
上記のコードではその値をチェックして、子メニューに応じたメッセージを出力するようにしています。
メニューバーの作成についての説明は以上です。
次回はタイマーについて説明します。
>> 【タイマー】に進む
>> WINAPI入門トップに戻る













