次の方法で共有


メニューについて

メニューは、アプリケーションのオプションまたはオプションのグループ (サブメニュー) を指定する項目の一覧です。 メニュー項目をクリックするとサブメニューが開くか、アプリケーションでコマンドが実行されます。 このセクションでは、次のトピックについて説明します。

メニューは階層に配置されます。 階層の最上位レベルには メニュー バーがあります。メニュー の一覧が含まれており、サブメニュー を含めることができます。 メニュー バーは トップレベル メニューと呼ばれ、メニューとサブメニューは ポップアップ メニューとも呼ばれます。

メニュー項目は、コマンドを実行するか、サブメニューを開くことができます。 コマンドを実行する項目は、コマンド 項目 または コマンドと呼ばれます。

メニュー バーの項目は、ほとんどの場合、メニューを開きます。 メニュー バーにコマンド項目が含まれていることはほとんどありません。 メニュー バーから開いたメニューは、メニュー バーからドロップダウンし、 ドロップダウン メニューと呼ばれることもあります。 ドロップダウン メニューが表示されると、メニュー バーにアタッチされます。 ドロップダウン メニューを開くメニュー バーのメニュー項目は、 メニュー名とも呼ばれます。

メニュー バーのメニュー名は、アプリケーションが提供するコマンドのメインカテゴリを表します。 通常、メニュー バーからメニュー名を選択すると、メニュー項目がカテゴリ内のコマンドに対応するメニューが開きます。 たとえば、メニュー バーに [ ファイル] メニュー名が含まれている場合、ユーザーがクリックすると、[ 新規作成]、[ 開く]、[ 保存] などのメニュー項目を含むメニューがアクティブになります。 メニュー バーに関する情報を取得するには、 GetMenuBarInfo を呼び出します。

メニュー バーを含めることができるのは、重なり合ったウィンドウまたはポップアップ ウィンドウだけです。子ウィンドウに子ウィンドウを含めることはできません。 ウィンドウにタイトル バーがある場合、メニュー バーはそのすぐ下に配置されます。 メニュー バーは常に表示されます。 ただし、サブメニューは、ユーザーがアクティブ化するメニュー項目を選択するまで表示されません。 重複ウィンドウとポップアップ ウィンドウの詳細については、「 ウィンドウの種類」を参照してください。

各メニューには所有者ウィンドウが必要です。 ユーザーがメニューを選択するか、メニューから項目を選択すると、システムによってメニューの所有者ウィンドウにメッセージが送信されます。

このセクションでは、次のトピックについて説明します。

ショートカット メニュー

また、 ショートカット メニューも提供されます。 ショートカット メニューがメニュー バーにアタッチされていません。画面の任意の場所に表示できます。 通常、アプリケーションは、ショートカット メニューを、クライアント領域などのウィンドウの一部、またはアイコンなどの特定のオブジェクトに関連付けます。 このため、これらのメニューは コンテキスト メニューとも呼ばれます。

ショートカット メニューは、ユーザーがアクティブ化するまで非表示のままになります。通常は、選択項目、ツール バー、またはタスク バー ボタンを右クリックします。 メニューは通常、キャレットカーソルまたはマウスカーソルの位置に表示されます。

ウィンドウ メニュー

[ウィンドウ] メニュー ([システム] メニューまたは [コントロール] メニューとも呼ばれます) は、オペレーティング システムによってほぼ排他的に定義および管理されるポップアップ メニューです。 ユーザーは、タイトル バーのアプリケーション アイコンをクリックするか、タイトル バーの任意の場所を右クリックして、ウィンドウ メニューを開くことができます。

[ウィンドウ] メニューには、ユーザーがウィンドウのサイズまたは位置を変更したり、アプリケーションを閉じる場合に選択できる標準のメニュー項目セットが用意されています。 ウィンドウ メニューの項目は追加、削除、変更できますが、ほとんどのアプリケーションでは標準のメニュー項目セットが使用されます。 重なり合ったウィンドウ、ポップアップ ウィンドウ、または子ウィンドウには、ウィンドウ メニューを含めることができます。 ウィンドウ メニューが重複またはポップアップ ウィンドウに含まれていないのは一般的ではありません。

ユーザーが [ウィンドウ] メニューからコマンドを選択すると、システムはメニューの所有者ウィンドウに WM_SYSCOMMAND メッセージを送信します。 ほとんどのアプリケーションでは、ウィンドウ プロシージャはウィンドウ メニューからのメッセージを処理しません。 代わりに、単にメッセージを DefWindowProc 関数に渡して、メッセージのシステムの既定の処理を行います。 アプリケーションがウィンドウ メニューにコマンドを追加する場合、ウィンドウ プロシージャでコマンドを処理する必要があります。

アプリケーションは GetSystemMenu 関数を使用して、変更する既定のウィンドウ メニューのコピーを作成できます。 GetSystemMenu 関数を使用してウィンドウ メニューの独自のコピーを作成しないウィンドウは、標準のウィンドウ メニューを受け取ります。

ヘルプ識別子

各メニュー バー、メニュー、サブメニュー、ショートカット メニューに関連付けられているのは、ヘルプ識別子です。 メニューがアクティブな状態でユーザーが F1 キーを押すと、この値はWM_HELP メッセージの一部として所有者ウィンドウ 送信されます。

メニューへのキーボード アクセス

システムには、メニュー用の標準キーボード インターフェイスが用意されています。 メニュー項目にニーモニック アクセス キーとショートカット (アクセラレータ) キーを指定することで、このインターフェイスを強化できます。

次のトピックでは、標準のキーボード インターフェイス、アクセス キー、およびショートカット キーについて説明します。

標準キーボード インターフェイス

システムは、マウスやその他のポインティング デバイスの有無にかかわらず動作するように設計されています。 システムには標準のキーボード インターフェイスが用意されているため、ユーザーはキーボードを使用してメニュー項目を選択できます。 このキーボード インターフェイスには特別なコードは必要ありません。 ユーザーがキーボードまたはマウスを使用してメニュー項目を選択したかどうかに関係なく、アプリケーションはコマンド メッセージを受け取ります。 標準のキーボード インターフェイスでは、次のキーストロークが処理されます。

キー操作 アクション
アルファベット文字 指定した文字をアクセス キーとして持つ最初のメニュー項目を選択します。 選択した項目がメニューを呼び出すと、メニューが表示され、最初の項目が強調表示されます。 それ以外の場合は、メニュー項目が選択されます。
Alt メニュー バー モードのオンとオフを切り替えます。
Alt + Space MMC のウィンドウ メニューを表示します。
Enter メニューをアクティブ化し、項目にメニューが関連付けられている場合は、最初のメニュー項目を選択します。 それ以外の場合、このキーストロークは、項目が選択されている間にユーザーがマウス ボタンを離したかのように項目を選択します。
Esc メニュー モードを終了します。
前の最上位メニュー項目に切り替えます。 最上位のメニュー項目には、メニュー名とウィンドウ メニューが含まれます。 選択した項目がメニュー内にある場合は、メニューの前の列が選択されているか、前の最上位メニュー項目が選択されます。
逆方向を除き、←キーと同様に動作します。 メニューでは、このキーストロークは 1 列進みます。現在選択されている項目が右端の列にある場合は、次のメニューが選択されます。
上矢印または下矢印 メニュー名を押したときにメニューをアクティブにします。 メニューで押すと、上方向キーストロークで前の項目が選択されます。↓キーストロークで次の項目を選択します。

 

メニューの標準キーボード インターフェイスは、メニュー項目にアクセス キー (ニーモニック) を追加することで強化できます。 アクセス キーは、メニュー項目のテキストの下線付きの文字です。 メニューがアクティブな場合、ユーザーは項目の下線付きの文字に対応するキーを押すことで、メニュー項目を選択できます。 ユーザーは、Alt キーを押してメニュー バーの最初の項目を強調表示することで、メニュー バーをアクティブにします。 メニューが表示されるとアクティブになります。

メニュー項目のアクセス キーを作成するには、項目のテキスト文字列内の任意の文字の前にアンパサンドを付けます。 たとえば、テキスト文字列 "&Move" を指定すると、システムは文字 "M" に下線を引きます。

アクセス キーに加えて、メニュー項目にはショートカット キーを関連付けることができます。 ショートカット キーは、ショートカット キーを機能させるためにメニューをアクティブにする必要がないため、アクセス キーとは異なります。 また、アクセス キーは 常に メニュー項目に関連付けられますが、ショートカット キーは 通常 メニュー項目に関連付けられます (ただし、関連付ける必要はありません)。

ショートカット キーを識別するテキストが、メニュー項目のテキスト文字列に追加されます。 ショートカット テキストは、円記号とタブ文字 (\t) の後に、メニュー項目名の右側に表示されます。 たとえば、"&Close\tAlt+F4" は Close コマンドを表し、Alt + F4 キーの組み合わせをショートカット キーとして、文字 "C" をアクセス キーとして使用します。 詳細については、「 キーボード アクセラレータ」を参照してください。

メニュー テンプレートまたはメニュー作成関数を使用して、メニューを作成できます。 メニュー テンプレートは通常、リソースとして定義されます。 メニュー テンプレート リソースは、明示的に読み込むか、ウィンドウ クラスの既定のメニューとして割り当てることができます。 メモリ内でメニュー テンプレート リソースを動的に作成することもできます。

次のトピックでは、メニューの作成について詳しく説明します。

ほとんどのアプリケーションでは、メニュー テンプレート リソースを使用してメニューを作成します。 メニュー テンプレートでは、メニュー バーの項目とすべてのメニューを含むメニューが定義されます。 メニュー テンプレート リソースの作成の詳細については、開発ツールに含まれているドキュメントを参照してください。

メニュー テンプレート リソースを作成し、アプリケーションの実行可能ファイル (.exe) に追加した後、 LoadMenu 関数を使用してリソースをメモリに読み込むことができます。 この関数はメニューへのハンドルを返します。このハンドルは 、SetMenu 関数を使用してウィンドウに割り当てることができます。 子ウィンドウではない任意のウィンドウにメニューを割り当てることができます。

メニューをリソースとして実装すると、アプリケーションをローカライズして複数の国/地域で使用する方が簡単になります。 リソース定義ファイルのみを、アプリケーションのソース コードではなく、言語ごとにローカライズする必要があります。

実行時にメモリに組み込まれているメニュー テンプレートからメニューを作成できます。 たとえば、ユーザーがメニューをカスタマイズできるようにするアプリケーションでは、ユーザーの設定に基づいてメモリ内にメニュー テンプレートを作成できます。 その後、アプリケーションはテンプレートをファイルまたはレジストリに保存して、将来使用することができます。 メモリ内のテンプレートからメニューを作成するには、 LoadMenuIndirect 関数を使用します。 メニュー テンプレート形式の説明については、「 メニュー テンプレート リソース」を参照してください。

標準メニュー テンプレートは、 MENUITEMTEMPLATEHEADER 構造体とそれに続く 1 つ以上 の MENUITEMTEMPLATE 構造体で構成されます。

拡張メニュー テンプレートは、 MENUEX_TEMPLATE_HEADER 構造の後に 1 つ以上の MENUEX_TEMPLATE_ITEM 構造で構成されます。

システムは、各メニューに対して一意のハンドルを生成します。 メニュー ハンドル、HMENU 型の値です。 アプリケーションでは、多くのメニュー機能でメニュー ハンドルを指定する必要があります。 メニューを作成するか、メニュー リソースを読み込むと、メニュー バーへのハンドルが表示されます。

作成または読み込まれたメニューのメニュー バーへのハンドルを取得するには、 GetMenu 関数を使用します。 メニュー項目に関連付けられているサブメニューへのハンドルを取得するには、 GetSubMenu または GetMenuItemInfo 関数を使用します。 ウィンドウ メニューへのハンドルを取得するには、 GetSystemMenu 関数を使用します。

メニュー作成関数を使用すると、実行時にメニューを作成したり、既存のメニューにメニュー項目を追加したりできます。 CreateMenu 関数を使用して空のメニュー バーを作成し、CreatePopupMenu 関数を使用して空のメニューを作成できます。 MENUINFO 構造体を使用して、メニューの特定の設定情報を保存できます。 メニューの設定を取得または取得するには、 GetMenuInfo または SetMenuInfo を使用します。 メニューに項目を追加するには、 InsertMenuItem 関数を使用します。 古い AppendMenu 関数と InsertMenu 関数は引き続きサポートされていますが、新しいアプリケーションには InsertMenuItem を使用する必要があります。

メニューが読み込まれたり作成された後、システムで表示する前に、そのメニューをウィンドウに割り当てる必要があります。 クラス メニューを定義することで、メニューを割り当てることができます。 詳細については、「 ウィンドウ クラス メニュー」を参照してください。 CreateWindow 関数または CreateWindowEx 関数の hMenu パラメーターとしてメニューへのハンドルを指定するか、SetMenu 関数を呼び出して、ウィンドウにメニューを割り当てることもできます。

ショートカット メニューを表示するには、 TrackPopupMenuEx 関数を使用します。 ショートカット メニュー (フローティング ポップアップ メニューまたはコンテキスト メニューとも呼ばれます) は、通常、 WM_CONTEXTMENU メッセージの処理時に表示されます。

子ウィンドウではない任意のウィンドウにメニューを割り当てることができます。

古い TrackPopupMenu 関数は引き続きサポートされていますが、新しいアプリケーションでは TrackPopupMenuEx 関数を使用する必要があります。

ウィンドウ クラス メニュー

ウィンドウ クラスを登録するときに、 クラス メニュー と呼ばれる既定のメニューを指定できます。 これを行うには、メニュー テンプレート リソースの名前を、クラスの登録に使用される WNDCLASS 構造体の lpszMenuName メンバーに割り当てます。

既定では、すべてのウィンドウにウィンドウ クラスのクラス メニューが割り当てられるため、メニューを明示的に読み込んで各ウィンドウに割り当てる必要はありません。 CreateWindowEx 関数の呼び出しで別のメニュー ハンドルを指定することで、クラス メニューをオーバーライドできます。 SetMenu 関数を使用して、作成後にウィンドウのメニューを変更することもできます。 詳細については、「 ウィンドウ クラス」を参照してください。

次のトピックでは、ユーザーがメニュー項目を選択したときのシステムの動作と、アプリケーションが項目の外観と機能を制御する方法について説明します。

サブメニューを開くコマンド項目と項目

ユーザーがコマンド項目を選択すると、メニューを所有するウィンドウにコマンド メッセージが送信されます。 コマンド項目がウィンドウ メニューにある場合、システムは WM_SYSCOMMAND メッセージを送信します。 それ以外の場合は、 WM_COMMAND メッセージが送信されます。

サブメニューを開く各メニュー項目に関連付けられているのは、対応するサブメニューへのハンドルです。 ユーザーがこのような項目をポイントすると、サブメニューが開きます。 所有者ウィンドウにコマンド メッセージは送信されません。 ただし、システムはサブメニューを表示する前に 、所有者 ウィンドウにWM_INITMENUPOPUPメッセージを送信します。 GetSubMenu または GetMenuItemInfo 関数を使用して、項目に関連付けられているサブメニューへのハンドルを取得できます。

通常、メニュー バーにはメニュー名が含まれますが、コマンド項目を含めることもできます。 サブメニューには通常、コマンド項目が含まれますが、入れ子になったサブメニューを開く項目を含めることもできます。 このような項目をサブメニューに追加することで、メニューを任意の深さに入れ子にすることができます。 ユーザーに視覚的な手掛かりを提供するために、サブメニューを開くメニュー項目のテキストの右側に小さな矢印が自動的に表示されます。

各メニュー項目に関連付けられるのは、メニュー 項目識別子と呼ばれる一意のアプリケーション定義の整数です。 ユーザーがメニューからコマンド項目を選択すると、WM_COMMAND メッセージの一部としてアイテムの識別子が所有者ウィンドウ 送信されます。 ウィンドウ プロシージャは、識別子を調べてメッセージのソースを決定し、それに応じてメッセージを処理します。 また、メニュー関数を呼び出すときに、その識別子を使用してメニュー項目を指定することもできます。たとえば、メニュー項目を有効または無効にする場合などです。

サブメニューを開くメニュー項目には、コマンド項目と同様に識別子があります。 ただし、メニューからそのような項目が選択されている場合、システムはコマンド・メッセージを送信しません。 代わりに、メニュー項目に関連付けられているサブメニューが開きます。

指定した位置にあるメニュー項目の識別子を取得するには、 GetMenuItemID または GetMenuItemInfo 関数を使用します。

一意の識別子に加えて、メニュー バーまたはメニューの各メニュー項目には一意の位置の値があります。 メニュー バーの左端の項目、またはメニューの一番上の項目の位置は 0 です。 位置の値は、後続のメニュー項目に対してインクリメントされます。 区切り記号を含め、メニュー内のすべての項目に位置値が割り当てられます。 次の図は、メニュー バーとメニュー内の項目の位置の値を示しています。

メニュー バーとメニュー

特定のメニュー項目に関する情報を変更または取得するメニュー関数を呼び出すときは、その識別子またはその位置を使用して項目を指定できます。 詳細については、次のセクションを参照してください。

プログラムによるメニュー項目へのアクセス

ほとんどのメニュー関数を使用すると、位置またはコマンドでメニュー項目を指定できます。 一部の関数では、 検索 アルゴリズムを示すためにMF_BYPOSITIONフラグと MF_BYCOMMAND フラグが使用されます。他のユーザーには、明示的な fByPosition パラメーターがあります。 メニュー項目を位置で指定すると、項目番号はメニュー内の 0 から始まるインデックスになります。 コマンドでメニュー項目を指定すると、メニューとそのサブメニューで、メニュー識別子が指定された項目番号と等しい項目が検索されます。 メニュー階層内の複数の項目が項目番号と一致する場合、どの項目を使用するかを指定できません。 メニューに重複するメニュー識別子が含まれている場合は、このあいまいさを回避するために、位置ベースのメニュー操作を使用する必要があります。

既定のメニュー項目

サブメニューには、既定のメニュー項目を 1 つ含めることができます。 ユーザーがダブルクリックしてサブメニューを開くと、システムはメニューの所有者ウィンドウにコマンド メッセージを送信し、既定のコマンド項目が選択されているかのようにメニューを閉じます。 既定のコマンド項目がない場合、サブメニューは開いたままです。 サブメニューの既定の項目を取得して設定するには、 GetMenuDefaultItem 関数と SetMenuDefaultItem 関数を 使用します。

メニュー項目の選択とクリア

メニュー項目は、選択またはクリアできます。 選択したメニュー項目の横にビットマップが表示され、選択した状態が示されます。 アプリケーション定義の "クリア" ビットマップが指定されていない限り、システムはクリア項目の横にビットマップを表示しません。 メニュー内のメニュー項目のみを選択できます。メニュー バーの項目を選択できません。

通常、アプリケーションはメニュー項目をチェックまたはクリアして、オプションが有効かどうかを示します。 たとえば、アプリケーションにツールバーがあり、メニューの Toolbar コマンドを 使用してユーザーが表示/非表示を切り替えることができるとします。 ツール バーが非表示の場合、[ ツール バー ] メニュー項目はクリアされます。 ユーザーがコマンドを選択すると、アプリケーションによってメニュー項目がチェックされ、ツール バーが表示されます。

チェックマーク属性は、メニュー項目を選択するかどうかを制御します。 CheckMenuItem 関数を使用して、メニュー項目のチェックマーク属性を設定できます。 GetMenuState 関数を使用して、メニュー項目が現在選択されているかクリアされているかを確認できます。

CheckMenuItemGetMenuState の代わりに、GetMenuItemInfo 関数と SetMenuItemInfo 関数を使用して、メニュー項目のチェック状態を取得および設定できます。

メニュー項目のグループが、相互に排他的なオプションのセットに対応する場合があります。 この場合は、選択したラジオ メニュー項目 (ラジオ ボタン コントロールに似ています) を使用して、選択したオプションを指定できます。 選択したラジオ項目は、チェックマーク ビットマップではなく、箇条書きのビットマップで表示されます。 メニュー項目をチェックしてラジオ項目にするには、CheckMenuRadioItem 関数を使用します。

既定では、選択したメニュー項目の横にチェックマークまたは行頭文字ビットマップが表示され、クリアされたメニュー項目の横にビットマップは表示されません。 ただし、 SetMenuItemBitmaps 関数を使用して、アプリケーション定義の選択およびクリアされたビットマップをメニュー項目に関連付けることができます。 その後、システムは指定されたビットマップを使用して、メニュー項目の選択またはクリア状態を示します。

メニュー項目に関連付けられているアプリケーション定義ビットマップは、既定のチェックマーク ビットマップと同じサイズにする必要があります。そのサイズは、画面の解像度によって異なる場合があります。 正しいディメンションを取得するには、 GetSystemMetrics 関数を 使用します。 さまざまな画面解像度に対して複数のビットマップ リソースを作成できます。1 つのビットマップ リソースを作成し、必要に応じてスケーリングします。または、実行時にビットマップを作成し、その中にイメージを描画します。 ビットマップはモノクロまたはカラーのいずれかになります。 ただし、メニュー項目は強調表示されると反転されるため、特定の反転カラー ビットマップの外観が望ましくない場合があります。 詳細については、「 ビットマップ」を参照してください。

有効、灰色、無効のメニュー項目

メニュー項目は、有効、灰色、または無効にすることができます。 既定では、メニュー項目は有効になっています。 ユーザーが有効なメニュー項目を選択すると、システムは、メニュー項目の種類に応じて、コマンド メッセージを所有者ウィンドウに送信するか、対応するサブメニューを表示します。

ユーザーがメニュー項目を使用できない場合は、灰色または無効にする必要があります。 灰色のメニュー項目と無効なメニュー項目は選択できません。 無効なアイテムは、有効なアイテムと同じように見えます。 ユーザーが無効なアイテムをクリックすると、そのアイテムは選択されず、何も起こりません。 無効な項目は、たとえば、アクティブに見えるが表示されないメニューを示すチュートリアルで役立ちます。

アプリケーションは、使用できないメニュー項目を灰色表示して、コマンドが使用できないことをユーザーに視覚的に示します。 アクションが適切でない場合は、灰色の項目を使用できます (たとえば、システムにプリンターがインストールされていない場合は、[ファイル] メニューの [印刷] コマンドを灰色で表示できます)。

EnableMenuItem 関数は、メニュー項目を有効、灰色、または無効にします。 メニュー項目が有効、灰色、または無効になっているかどうかを確認するには、 GetMenuItemInfo 関数を使用します。

GetMenuItemInfo の代わりに、GetMenuState 関数を使用して、メニュー項目が有効、灰色、または無効になっているかどうかを判断することもできます。

強調表示されたメニュー項目

ユーザーがメニューを選択すると、メニュー項目が自動的に強調表示されます。 ただし、 HiliteMenuItem 関数を使用すると、メニュー バーのメニュー名から強調表示を明示的に追加または削除できます。 この関数は、メニューのメニュー項目には影響しません。 ただし、メニュー名を強調表示するために HiliteMenuItem を使用すると、名前のみが選択されているように見えます。 ユーザーが Enter キーを押した場合、強調表示された項目は選択されません。 この機能は、たとえば、メニューの使用を示すトレーニング アプリケーションで役立つ場合があります。

メニュー項目のOwner-Drawn

アプリケーションは、 所有者が描画した項目を使用して、メニュー項目の外観を完全に制御できます。 所有者が描画したアイテムには、選択 (強調表示)、選択、クリアされた状態の描画に対して、アプリケーションが完全に責任を負う必要があります。 たとえば、アプリケーションがフォント メニューを提供した場合、対応するフォントを使用して各メニュー項目を描画できます。Roman の項目はローマ字で描画され、斜体の項目は斜体で描画されます。 詳細については、「 Owner-Drawnメニュー項目の作成」を参照してください。

システムは、水平線として表示される、 区切り記号と呼ばれる特別な種類のメニュー項目を提供します。 区切り記号を使用して、メニューを関連する項目のグループに分割できます。 区切り記号はメニュー バーで使用できず、ユーザーは区切り記号を選択できません。

メニュー バーに 1 行に収まるよりも多くのメニュー名が含まれている場合、メニュー バーは自動的に 2 行以上に分割されて折り返されます。 メニュー バーの特定の項目で改行を行うには、 MFT_MENUBREAK 型フラグを項目に割り当てます。 その明細と後続のすべての明細が新しい行に配置されます。

1 つの列に収まらない項目がメニューに含まれている場合、メニューは切り捨てられます。 MFT_MENUBREAK 型フラグ を項目に割り当てるか、 MENUITEM ステートメントの MENUBREAK オプションを使用して、メニュー内の特定の項目で列区切りを発生させることができます。 その項目と後続のすべての項目が新しい列に配置されます。 MFT_MENUBARBREAK型フラグは、新しい列と古い列の間に垂直線が表示されることを除き、同じ効果を持ちます。

AppendMenuInsertMenu、または ModifyMenu 関数を使用して改行を割り当てる場合は、型フラグをMF_MENUBREAKまたはMF_MENUBARBREAK割り当てる必要があります。

メニューで使用されるメッセージ

メニューを所有するウィンドウのウィンドウ プロシージャにメッセージを送信することで、メニュー関連のアクティビティが報告されます。 ユーザーがメニュー バーの項目を選択するか、マウスの右ボタンをクリックしてショートカット メニューを表示すると、一連のメッセージが送信されます。

ユーザーがメニュー バーの項目をアクティブ化すると、所有者ウィンドウは最初に WM_SYSCOMMAND メッセージを受け取ります。 このメッセージには、ユーザーがキーボード (SC_KEYMENU) またはマウス (SC_MOUSEMENU) を使用してメニューをアクティブ化したかどうかを示すフラグが含まれています。 詳細については、「 メニューへのキーボード アクセス」を参照してください。

次に、メニューを表示する前に、 ユーザーがメニュー を表示する前にアプリケーションがメニューを変更できるように、WM_INITMENU メッセージがウィンドウ プロシージャに送信されます。 システムは、メニューのアクティブ化ごとに 1 回だけ WM_INITMENU メッセージを送信します。

ユーザーがサブメニューを開くメニュー項目をポイントすると、システムはサブメニューを表示する前に 、WM_INITMENUPOPUP メッセージを所有者ウィンドウに送信します。 このメッセージは、表示される前にサブメニューを変更する機会をアプリケーションに提供します。

ユーザーが強調表示をある項目から別の項目に移動するたびに、メニューの所有者ウィンドウのウィンドウ プロシージャに WM_MENUSELECT メッセージが送信されます。 このメッセージは、現在選択されているメニュー項目を識別します。 多くのアプリケーションは、メイン ウィンドウの下部に情報領域を提供し、このメッセージを使用して、選択したメニュー項目に関する追加情報を表示します。

ユーザーがメニューからコマンド項目を選択すると、 WM_COMMAND メッセージが ウィンドウ プロシージャに送信されます。 WM_COMMAND メッセージの wParam パラメーターの下位ワードには、選択した項目の識別子が含まれています。 ウィンドウ プロシージャでは、識別子を調べて、それに応じてメッセージを処理する必要があります。

MENUINFO 構造体を使用して、メニューの情報を保存できます。 メニューが MENUINFO で定義されている場合。dwStyle 値が MNS_NOTIFYBYPOS の場合、システムは項目 選択されたときに WM_COMMANDではなくWM_MENUCOMMAND を送信します。 これにより、 MENUINFO 構造体の情報にアクセスでき、選択した項目のインデックスも直接提供されます。

ウィンドウのメニュー バーからすべてのメニューにアクセスできるわけではありません。 多くのアプリケーションでは、ユーザーが特定の場所でマウスの右ボタンをクリックすると、ショートカット メニューが表示されます。 このようなアプリケーションでは、 WM_CONTEXTMENU メッセージを処理し、必要に応じてショートカット メニューを表示する必要があります。 アプリケーションにショートカット メニューが表示されない場合は、既定の処理のために WM_CONTEXTMENU メッセージを DefWindowProc 関数に渡す必要があります。

WM_MENURBUTTONUP メッセージは、カーソルがメニュー項目にあるときにユーザーがマウスの右ボタンを離したときに送信されます。 このメッセージは、アプリケーションがメニュー項目の状況依存メニューまたはショートカット メニューを表示できるように提供されます。

ドラッグ アンド ドロップ メニューのみを含むメッセージがいくつかあります。 マウス カーソルがメニュー項目に入るか、項目の中央から項目の上部または下部に移動すると、 WM_MENUGETOBJECT はドラッグ アンド ドロップ メニューの所有者に送信されます。 WM_MENUDRAG メッセージは、ユーザーが実際にメニュー項目をドラッグしたときに送信されます。

ドロップダウン メニューまたはサブメニューが破棄されると、システムは WM_UNINITMENUPOPUP メッセージを送信します。

メニューがウィンドウに割り当てられ、そのウィンドウが破棄された場合、システムはメニューとそのサブメニューを自動的に破棄し、メニューのハンドルとメニューが占有するメモリを解放します。 ウィンドウに割り当てられないメニューは自動的には破棄されません。 アプリケーションは DestroyMenu 関数を呼び出して、割り当てられていないメニューを破棄する必要があります。 それ以外の場合、アプリケーションを閉じても、メニューはメモリ内に存在し続けます。 呼び出し元スレッドのアクティブ メニューを終了するには、 EndMenu を使用します。 プラットフォームで EndMenu がサポートされていない場合は、アクティブなメニューの所有者に WM_CANCELMODE メッセージを送信します。