メニューの制御

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を設定していますが、ここにさらにポップアップメニューを追加してサブメニューを出す事も可能です。
この場合は、まずサブメニューのハンドルを作成してそこにメニューアイテムを追加し、サブメニューをメニューアイテムとして上位のメニューにAppendMenu()する、という形になります。例えば、メニュー1に「サブ項目1」「サブ項目2」というサブメニューアイテムを持つメニューアイテム「サブメニュー」を追加するには以下のようにします。

  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で送られてくる選択されたメニューアイテムのIDLOWORD(wParam))を利用して以下のように選択されたメニューをチェックすると楽でしょう。

  CheckMenuRadioItem(hMenuSub,11,13,LOWORD(wParam),MF_BYCOMMAND);

また、メニューがポップアップされる時にはウインドウにWM_INITMENUPOPUPメッセージが送られてくるので、このメッセージを捉える事でポップアップするメニューのメニューアイテムを動的に調整できます。例えば、クリップボードの内容に応じて「貼り付け」メニューを有効・無効化する時などに便利でしょう。このメッセージでは、lParamにポップアップされるメニューの位置が入るのでそれを見ればポップアップされるメニューを特定出来ます。
メニューの有効・無効はEnableMenuItem()MF_ENABLED/MF_GRAYEDを指定して設定します。

プログラム

プログラムソース表示

「メニュー1」「サブメニュー」という2つのメニューを持つウインドウを作成します。メニュー1には、「項目2有効」というメニューアイテムがあり、ここをチェックするとメニューのポップアップ時に「項目2」が有効化されます。


プログラミング資料庫 > Windowsプログラミング研究室