>> 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入門トップに戻る