Windowsプログラミングでメニューを作成する処理では、CreateMenu()で作成したメニューハンドルにAppendMenu()でメニューアイテムを追加して行きました。あとは、このメニューをマウスクリックに応じてポップアップするなり、ウインドウのメニューに設定するなりして利用する事が出来るわけです。今回は、一歩進んでサブメニューの追加やメニューアイテムの有効・無効化、メニューアイテムのチェック、ポップアップ時の動的メニュー設定などを試してみましょう。 メニューの作成まずサブメニューを持たない通常のメニュー作成の手順は、トップレベルのメニューハンドルを作成し、そのハンドルにメニューアイテムを持つ各メニューのハンドルをAppendMenu()していく、というものでした。例えば、 // メニューハンドル作成 hMenu=CreateMenu(); // トップレベル hMenu1=CreateMenu(); // 「メニュー1」メニュー // 「メニュー1」メニューアイテム作成 AppendMenu(hMenu1,MF_STRING,1,"項目1(&S)"); AppendMenu(hMenu1,MF_STRING,2,"項目2(&2)"); // トップレベルメニューに追加 AppendMenu(hMenu,MF_POPUP,(UINT)hMenu1,"メニュー1(&1)"); とすると「項目1」「項目2」というメニューアイテムを持つ「メニュー1」メニューを持ったメニューhMenuが出来ます。上のAppendMenu()では、メニューアイテムの追加で文字列と選択時に送られてくるメニューIDを設定していますが、ここにさらにポップアップメニューを追加してサブメニューを出す事も可能です。 hMenuSub1=CreateMenu(); // サブメニュー AppendMenu(hMenuSub1,MF_STRING,3,"サブ項目1(&1)"); AppendMenu(hMenuSub1,MF_STRING,4,"サブ項目2(&2)"); hMenu1=CreateMenu(); // 「メニュー1」メニュー AppendMenu(hMenu1,MF_STRING,1,"項目1(&S)"); AppendMenu(hMenu1,MF_STRING,2,"項目2(&2)"); AppendMenu(hMenu1,MF_POPUP,(UINT)hMenuSub1,"サブ項目(&S)"); このようにして作成したメニューは、SetMenu()でウインドウのメニューに設定できます。 メニューの制御メニューアイテムには、CheckMenuItem()やCheckMenuRadioItem()でチェックマークをつける事が出来ます。CheckMenuItem()は通常の選択状態をあらわすチェック、CheckMenuRadioItem()はグループ化された項目から1つだけ選択状態にするラジオチェックです。CheckMenuItem()では、メニューアイテムが属するメニューハンドルとメニューアイテムのIDまたはメニュー内での位置を指定してチェックのオン・オフを制御し、CheckMenuRadioItem()ではさらにグループ化するメニューアイテムの範囲を指定します。例えば、 CheckMenuRadioItem(hMenuSub,11,13,12,MF_BYCOMMAND); とすると、メニューハンドルhMenuSub内のID11-13がグループ化され、そのうちID12のメニューアイテムがチェックされるわけです。同時に、グループ内の他のアイテムにチェックがついていればそれが外されます。実際のプログラムでは、WM_COMMANDで送られてくる選択されたメニューアイテムのID(LOWORD(wParam))を利用して以下のように選択されたメニューをチェックすると楽でしょう。 CheckMenuRadioItem(hMenuSub,11,13,LOWORD(wParam),MF_BYCOMMAND); また、メニューがポップアップされる時にはウインドウにWM_INITMENUPOPUPメッセージが送られてくるので、このメッセージを捉える事でポップアップするメニューのメニューアイテムを動的に調整できます。例えば、クリップボードの内容に応じて「貼り付け」メニューを有効・無効化する時などに便利でしょう。このメッセージでは、lParamにポップアップされるメニューの位置が入るのでそれを見ればポップアップされるメニューを特定出来ます。 プログラム「メニュー1」「サブメニュー」という2つのメニューを持つウインドウを作成します。メニュー1には、「項目2有効」というメニューアイテムがあり、ここをチェックするとメニューのポップアップ時に「項目2」が有効化されます。 |