メニューは、アプリケーションのオプションまたはオプションのグループ (サブメニュー) を指定する項目の一覧です。 メニュー項目をクリックするとサブメニューが開くか、アプリケーションでコマンドが実行されます。 このセクションでは、次のトピックについて説明します。
メニュー バーとメニュー
メニューは階層に配置されます。 階層の最上位にはメニュー バーがあります。メニューの一覧を含むサブメニューを含めることができます。 メニュー バーは トップレベル メニューと呼ばれ、メニューとサブメニューは ポップアップ メニューとも呼ばれます。
メニュー項目は、コマンドを実行するか、サブメニューを開くことができます。 コマンドを実行する項目は、コマンド 項目 または コマンドと呼ばれます。
メニュー バーの項目は、ほとんどの場合、メニューを開きます。 メニュー バーにコマンド項目が含まれていることはほとんどありません。 メニュー バーから開いたメニューは、メニュー バーからドロップダウンし、 ドロップダウン メニューと呼ばれることもあります。 ドロップダウン メニューが表示されると、メニュー バーにアタッチされます。 ドロップダウン メニューを開くメニュー バーのメニュー項目は、 メニュー名とも呼ばれます。
メニュー バーのメニュー名は、アプリケーションが提供するコマンドの主なカテゴリを表します。 通常、メニュー バーからメニュー名を選択すると、メニュー項目がカテゴリ内のコマンドに対応するメニューが開きます。 たとえば、メニュー バーに [ ファイル ] メニュー名が含まれている場合、ユーザーがクリックすると、[ 新規]、[ 開く]、[ 保存] などのメニュー項目を含むメニューがアクティブになります。 メニュー バーに関する情報を取得するには、 GetMenuBarInfo を呼び出します。
メニューバーを含めることができるのは、重なっているウィンドウまたはポップアップウィンドウだけです。子ウィンドウはメニューバーを含めることができません。 ウィンドウにタイトル バーがある場合、システムはメニュー バーをそのすぐ下に配置します。 メニュー バーは常に表示されます。 ただし、サブメニューは、アクティブ化するメニュー項目をユーザーが選択するまで表示されません。 重複ウィンドウとポップアップ ウィンドウの詳細については、「 ウィンドウの種類」を参照してください。
各メニューには所有者ウィンドウが必要です。 ユーザーがメニューを選択するか、メニューから項目を選択すると、システムはメニューの所有者ウィンドウにメッセージを送信します。
このセクションでは、次のトピックについて説明します。
ショートカット メニュー
また、 ショートカット メニューも用意されています。 ショートカット メニューがメニュー バーにアタッチされていません。画面の任意の場所に表示できます。 通常、アプリケーションはショートカット メニューを、クライアント領域などのウィンドウの一部またはアイコンなどの特定のオブジェクトに関連付けます。 このため、これらのメニューは コンテキスト メニューとも呼ばれます。
ショートカット メニューは、ユーザーがアクティブ化するまで非表示のままになります。通常は、選択項目、ツールバー、またはタスク バー ボタンを右クリックします。 通常、メニューはキャレットカーソルまたはマウスカーソルの位置に表示されます。
ウィンドウ メニュー
[ウィンドウ] メニュー ([システム] メニューまたは [コントロール] メニューとも呼ばれます) は、オペレーティング システムによってほぼ排他的に定義および管理されるポップアップ メニューです。 ユーザーは、タイトル バーのアプリケーション アイコンをクリックするか、タイトル バーの任意の場所を右クリックして、ウィンドウ メニューを開くことができます。
[ウィンドウ] メニューには、ユーザーがウィンドウのサイズや位置を変更したり、アプリケーションを閉じたりするために選択できる標準のメニュー項目のセットが用意されています。 ウィンドウ メニューの項目は追加、削除、および変更できますが、ほとんどのアプリケーションでは標準のメニュー項目のセットが使用されます。 重なり合ったウィンドウ、ポップアップ ウィンドウ、または子ウィンドウには、ウィンドウ メニューを表示できます。 重なり合ったウィンドウやポップアップウィンドウがウィンドウメニューを含まないことは珍しいことです。
ユーザーが [ウィンドウ ] メニューからコマンドを選択すると、システムはメニューの所有者ウィンドウ にWM_SYSCOMMAND メッセージを送信します。 ほとんどのアプリケーションでは、ウィンドウ プロシージャはウィンドウ メニューからメッセージを処理しません。 代わりに、メッセージを DefWindowProc 関数に渡して、メッセージのシステムの既定の処理を行うだけです。 アプリケーションがウィンドウ メニューにコマンドを追加する場合、ウィンドウ プロシージャはコマンドを処理する必要があります。
アプリケーションでは 、GetSystemMenu 関数を使用して、変更する既定のウィンドウ メニューのコピーを作成できます。 GetSystemMenu 関数を使用してウィンドウ メニューの独自のコピーを作成しないウィンドウは、標準のウィンドウ メニューを受け取ります。
ヘルプ識別子
各メニュー バー、メニュー、サブメニュー、ショートカット メニューに関連付けられているのはヘルプ識別子です。 メニューがアクティブな状態でユーザーが F1 キーを押すと、この値はWM_HELPメッセージの一部として所有者ウィンドウ に 送信されます。
メニューへのキーボード アクセス
システムには、メニュー用の標準キーボード インターフェイスが用意されています。 メニュー項目のニーモニック アクセス キーとショートカット (アクセラレータ) キーを提供することで、このインターフェイスを強化できます。
次のトピックでは、標準のキーボード インターフェイス、アクセス キー、ショートカット キーについて説明します。
標準キーボード インターフェイス
システムは、マウスやその他のポインティング デバイスの有無にかかわらず動作するように設計されています。 システムには標準のキーボード インターフェイスが用意されているため、ユーザーはキーボードを使用してメニュー項目を選択できます。 このキーボード インターフェイスには特別なコードは必要ありません。 ユーザーがキーボードまたはマウスを使用してメニュー項目を選択するかどうかに関係なく、アプリケーションはコマンド メッセージを受け取ります。 標準のキーボード インターフェイスは、次のキーストロークを処理します。
キー操作 | アクション |
---|---|
アルファベット文字 | 指定した文字をアクセス キーとして持つ最初のメニュー項目を選択します。 選択した項目がメニューを呼び出すと、メニューが表示され、最初の項目が強調表示されます。 それ以外の場合は、メニュー項目が選択されます。 |
Alt | メニュー バー モードのオン/オフを切り替えます。 |
Alt+スペースバー | ウィンドウ メニューを表示します。 |
Enter | 項目にメニューが関連付けられている場合は、メニューをアクティブにし、最初のメニュー項目を選択します。 それ以外の場合、このキーストロークは、項目が選択されている間にユーザーがマウス ボタンを離したかのように項目を選択します。 |
Esc キー | メニュー モードを終了します。 |
← | 前の最上位レベルのメニュー項目に戻ります。 最上位のメニュー項目には、メニュー名とウィンドウ メニューが含まれます。 選択した項目がメニュー内にある場合は、メニューの前の列が選択されているか、前の最上位メニュー項目が選択されます。 |
右矢印 | 逆方向を除き、左方向キーと同様に動作します。 メニューでは、このキーストロークは 1 列進みます。現在選択されている項目が右端の列にある場合は、次のメニューが選択されます。 |
上矢印または下矢印 | メニュー名を押したときにメニューをアクティブにします。 メニューを押すと、上方向キーを押すと前の項目が選択されます。下方向キーを押すと、次の項目が選択されます。 |
メニュー アクセス キー
メニューの標準キーボード インターフェイスは、メニュー項目にアクセス キー (ニーモニック) を追加することで強化できます。 アクセス キーは、メニュー項目のテキスト内の下線付きの文字です。 メニューがアクティブな場合、ユーザーは項目の下線付き文字に対応するキーを押してメニュー項目を選択できます。 ユーザーは、Alt キーを押してメニュー バーの最初の項目を強調表示することで、メニュー バーをアクティブにします。 メニューが表示されるとアクティブになります。
メニュー項目のアクセス キーを作成するには、項目のテキスト文字列内の任意の文字の前にアンパサンドを付けます。 たとえば、テキスト文字列 ">Move" を指定すると、システムは文字 "M" に下線を引きます。
メニューショートカットキー
アクセス キーに加えて、メニュー項目にはショートカット キーを関連付けることができます。 ショートカット キーは、ショートカット キーを機能させるためにメニューをアクティブにする必要がないため、アクセス キーとは異なります。 また、アクセス キーは 常に メニュー項目に関連付けられますが、ショートカット キーは 通常 はメニュー項目に関連付けられます (ただし、関連付ける必要はありません)。
ショートカット キーを識別するテキストが、メニュー項目のテキスト文字列に追加されます。 ショートカット テキストは、円記号とタブ文字 (\t) の後に、メニュー項目名の右側に表示されます。 たとえば、">Close\tAlt+F4" は、ショートカット キーとして Alt + F4 キーの組み合わせを持ち、アクセス キーとして文字 "C" を持つ Close コマンドを表します。 詳細については、「 キーボード アクセラレータ」を参照してください。
メニューの作成
メニュー テンプレートまたはメニュー作成機能を使用して、メニューを作成できます。 通常、メニュー テンプレートはリソースとして定義されます。 メニュー テンプレート リソースは、明示的に読み込んだり、ウィンドウ クラスの既定のメニューとして割り当てたりすることができます。 メニュー テンプレート リソースをメモリ内に動的に作成することもできます。
次のトピックでは、メニューの作成について詳しく説明します。
メニュー テンプレートのリソース
ほとんどのアプリケーションでは、メニュー テンプレート リソースを使用してメニューを作成します。 メニュー テンプレートでは、メニュー バーの項目やすべてのメニューを含むメニューを定義します。 メニュー テンプレート リソースの作成の詳細については、開発ツールに含まれているドキュメントを参照してください。
メニュー テンプレート リソースを作成し、アプリケーションの実行可能ファイル (.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 関数を使用して、ウィンドウのメニューを作成した後に変更することもできます。 詳細については、「ウィンドウ クラス」を参照してください。
メニュー項目
次のトピックでは、ユーザーがメニュー項目を選択したときのシステムの動作と、アプリケーションが項目の外観と機能を制御する方法について説明します。
- コマンド項目とサブメニューを開く項目
- Menu-Item 識別子
- Menu-Item 位置
- プログラムによるメニュー項目へのアクセス
- 既定のメニュー項目
- メニュー項目の選択とクリア
- 有効、灰色、無効のメニュー項目
- 強調表示されたメニュー項目
- Owner-Drawn メニュー項目
- メニュー項目の区切り記号と改行
コマンド項目とサブメニューを開く項目
ユーザーがコマンド項目を選択すると、システムはメニューを所有するウィンドウにコマンド・メッセージを送信します。 コマンド項目がウィンドウ・メニューにある場合、システムは WM_SYSCOMMAND メッセージを送信します。 それ以外の場合は、 WM_COMMAND メッセージを送信します。
サブメニューを開く各メニュー項目に関連付けられているのは、対応するサブメニューへのハンドルです。 ユーザーがこのような項目をポイントすると、サブメニューが開きます。 所有者ウィンドウにコマンド メッセージは送信されません。 ただし、システムはサブメニューを表示する前に 、WM_INITMENUPOPUP メッセージを所有者ウィンドウに送信します。 GetSubMenu または GetMenuItemInfo 関数を使用して、項目に関連付けられているサブメニューへのハンドルを取得できます。
通常、メニュー バーにはメニュー名が含まれますが、コマンド項目を含めることもできます。 サブメニューには通常、コマンド項目が含まれますが、入れ子になったサブメニューを開く項目を含めることもできます。 このような項目をサブメニューに追加することで、メニューをどんな深さにも入れ子にすることができます。 ユーザーに視覚的な手掛かりを提供するために、サブメニューを開くメニュー項目のテキストの右側に小さな矢印が自動的に表示されます。
Menu-Item 識別子
各メニュー項目に関連付けられるのは、メニュー 項目識別子と呼ばれる、アプリケーション定義の一意の整数です。 ユーザーがメニューからコマンド項目を選択すると、システムは WM_COMMANDメッセージの 一部としてアイテムの識別子を所有者ウィンドウに送信します。 ウィンドウ プロシージャは、識別子を調べてメッセージのソースを特定し、それに応じてメッセージを処理します。 さらに、メニュー関数を呼び出すときに、その識別子を使用してメニュー項目を指定できます。たとえば、メニュー項目を有効または無効にする場合などです。
サブメニューを開くメニュー項目には、コマンド項目と同様に識別子があります。 ただし、メニューからそのような項目が選択されている場合、システムはコマンド・メッセージを送信しません。 代わりに、メニュー項目に関連付けられているサブメニューが開きます。
指定した位置にあるメニュー項目の識別子を取得するには、 GetMenuItemID または GetMenuItemInfo 関数を使用します。
Menu-Item 位置
一意の識別子を持つことに加えて、メニュー バーまたはメニューの各メニュー項目には一意の位置の値があります。 メニュー バーの左端の項目、またはメニューの一番上の項目の位置は 0 です。 位置の値は、後続のメニュー項目に対してインクリメントされます。 区切り記号を含め、メニュー内のすべての項目に位置値が割り当てられます。 次の図は、メニュー バーとメニュー内の項目の位置の値を示しています。
特定のメニュー項目に関する情報を変更または取得するメニュー関数を呼び出すときは、その識別子またはその位置を使用して項目を指定できます。 詳細については、次のセクションを参照してください。
プログラムによるメニュー項目へのアクセス
ほとんどのメニュー機能では、位置またはコマンドでメニュー項目を指定できます。 一部の関数では、 MF_BYPOSITION フラグと MF_BYCOMMAND フラグを使用して検索アルゴリズムを示します。他のユーザーには明示的な fByPosition パラメーターがあります。 メニュー項目を位置で指定した場合、項目番号はメニュー内の 0 から始まるインデックスになります。 メニュー項目をコマンドで指定した場合、メニューとそのサブメニューは、メニュー識別子が指定された項目番号と等しい項目を検索します。 メニュー階層内の複数の項目が項目番号と一致する場合、どの項目が使用されるかは指定されていません。 メニューに重複するメニュー識別子が含まれている場合は、このあいまいさを回避するために、位置ベースのメニュー操作を使用する必要があります。
既定のメニュー項目
サブメニューには、既定のメニュー項目を 1 つ含めることができます。 ユーザーがダブルクリックしてサブメニューを開くと、システムはメニューの所有者ウィンドウにコマンド メッセージを送信し、既定のコマンド項目が選択されているかのようにメニューを閉じます。 既定のコマンド項目がない場合、サブメニューは開いたままです。 サブメニューの既定の項目を取得して設定するには、 GetMenuDefaultItem 関数と SetMenuDefaultItem 関数を 使用します。
メニュー項目の選択とクリア
メニュー項目は、選択またはクリアできます。 選択したメニュー項目の横にビットマップが表示され、選択した状態が示されます。 アプリケーション定義の "クリア" ビットマップが指定されていない限り、システムはクリア項目の横にビットマップを表示しません。 メニュー内のメニュー項目のみを選択できます。メニュー バーの項目を選択できません。
通常、アプリケーションはメニュー項目をチェックまたはクリアして、オプションが有効かどうかを示します。 たとえば、メニューの Toolbar コマンドを使用してユーザーが表示または非表示にできる ツール バー がアプリケーションにあるとします。 ツール バーが非表示の場合、[ ツール バー ] メニュー項目はクリアされます。 ユーザーがコマンドを選択すると、アプリケーションによってメニュー項目がチェックされ、ツール バーが表示されます。
チェック マーク属性は、メニュー項目を選択するかどうかを制御します。 CheckMenuItem 関数を使用して、メニュー項目のチェック マーク属性を設定できます。 GetMenuState 関数を使用すると、メニュー項目が現在選択されているかクリアされているかを判断できます。
CheckMenuItem および GetMenuState の代わりに、GetMenuItemInfo 関数と SetMenuItemInfo 関数を使用して、メニュー項目のチェック状態を取得および設定できます。
メニュー項目のグループが、相互に排他的なオプションのセットに対応する場合があります。 この場合は、選択したラジオ メニュー項目 (ラジオ ボタン コントロールに似ています) を使用して、選択したオプションを指定できます。 選択したラジオ項目は、チェック マーク ビットマップではなく箇条書きビットマップと共に表示されます。 メニュー項目をチェックし、それをラジオ項目にするには、 CheckMenuRadioItem 関数を使用します。
既定では、選択したメニュー項目の横にチェック マークまたは行頭文字ビットマップが表示され、クリアされたメニュー項目の横にビットマップは表示されません。 ただし、 SetMenuItemBitmaps 関数を使用して、アプリケーション定義の選択およびクリアされたビットマップをメニュー項目に関連付けることができます。 その後、システムは指定されたビットマップを使用して、メニュー項目の選択またはクリア状態を示します。
メニュー項目に関連付けられているアプリケーション定義ビットマップは、既定のチェック マーク ビットマップと同じサイズにする必要があります。サイズは画面の解像度によって異なる場合があります。 正しいディメンションを取得するには、 GetSystemMetrics 関数を 使用します。 さまざまな画面解像度に対して複数のビットマップ リソースを作成できます。1 つのビットマップ リソースを作成し、必要に応じてスケーリングします。または、実行時にビットマップを作成し、その中にイメージを描画します。 ビットマップはモノクロまたはカラーのいずれかになります。 ただし、メニュー項目は強調表示されると反転されるため、特定の反転カラー ビットマップの外観が望ましくない可能性があります。 詳細については、「 ビットマップ」を参照してください。
有効、灰色、無効のメニュー項目
メニュー項目は、有効、灰色、または無効にすることができます。 既定では、メニュー項目が有効になっています。 ユーザーが有効なメニュー項目を選択すると、システムは所有者ウィンドウにコマンド メッセージを送信するか、メニュー項目の種類に応じて対応するサブメニューを表示します。
ユーザーがメニュー項目を使用できない場合は、グレー表示または無効にする必要があります。 灰色表示のメニュー項目と無効なメニュー項目は選択できません。 無効な項目は、有効な項目と同じように見えます。 ユーザーが無効な項目をクリックしても、その項目は選択されず、何も起こりません。 無効な項目は、たとえば、アクティブに見えるが実際にはアクティブでないメニューを表示するチュートリアルで役立ちます。
アプリケーションは、使用できないメニュー項目を淡色表示して、コマンドが使用できないことをユーザーに視覚的に示します。 アクションが適切でない場合は、灰色の項目を使用できます (たとえば、システムにプリンターがインストールされていない場合は、[ファイル] メニューの [印刷] コマンドを灰色で表示できます)。
EnableMenuItem 関数は、メニュー項目を有効、灰色、または無効にします。 メニュー項目が有効、灰色、無効のいずれであるかを確認するには、 GetMenuItemInfo 関数を使用します。
GetMenuItemInfo の代わりに、GetMenuState 関数を使用して、メニュー項目が有効か、灰色か無効かを判断することもできます。
強調表示されたメニュー項目
ユーザーがメニューを選択すると、メニュー項目が自動的に強調表示されます。 ただし、 HiliteMenuItem 関数を使用して、メニュー バーのメニュー名から強調表示を明示的に追加または削除できます。 この関数は、メニューのメニュー項目には影響しません。 ただし、メニュー名を強調表示するために HiliteMenuItem を使用すると、名前のみが選択されたように見えます。 ユーザーが Enter キーを押した場合、強調表示された項目は選択されません。 この機能は、メニューの使用方法を示すトレーニング アプリケーションなどに役立つ場合があります。
Owner-Drawn メニュー項目
アプリケーションでは、 所有者が描画した項目を使用して、メニュー項目の外観を完全に制御できます。 所有者が描画するアイテムでは、選択中(ハイライト表示中)、選択済み、および解除された状態の描画に対して、アプリケーションが全責任を負う必要があります。 たとえば、アプリケーションがフォント メニューを提供した場合、対応するフォントを使用して各メニュー項目を描画できます。ローマの項目はローマで描画され、斜体の項目は斜体で描画されます。 詳細については、「 Owner-Drawn メニュー項目の作成」を参照してください。
メニュー項目の区切り記号と改行
システムは、水平線として表示される、 区切り記号と呼ばれる特別な種類のメニュー項目を提供します。 区切り記号を使用して、メニューを関連項目のグループに分割できます。 区切り記号はメニュー バーで使用できず、ユーザーは区切り記号を選択できません。
メニュー バーに 1 行に収まるよりも多くのメニュー名が含まれている場合、メニュー バーは自動的に 2 行以上に分割されて折り返されます。 MFT_MENUBREAK型フラグを項目に割り当てることで、メニュー バーの特定の項目で改行を発生させることができます。 その項目と後続のすべての項目が新しい行に配置されます。
1 つの列に収まらない項目がメニューに含まれている場合、メニューは切り捨てられます。 MFT_MENUBREAK型フラグを項目に割り当てるか、MENUITEM ステートメントの MENUBREAK オプションを使用して、メニュー内の特定の項目で列区切りを発生させることができます。 その項目とその後のすべての項目が新しい列に配置されます。 MFT_MENUBARBREAK型フラグの効果は同じですが、新しい列と古い列の間に垂直線が表示される点が異なります。
AppendMenu、InsertMenu、または ModifyMenu 関数を使用して改行を割り当てる場合は、型フラグをMF_MENUBREAKまたはMF_MENUBARBREAK割り当てる必要があります。
メニューで使用されるメッセージ
システムは、メニューを所有するウィンドウのウィンドウ プロシージャにメッセージを送信することで、メニュー関連のアクティビティを報告します。 ユーザーがメニュー バーの項目を選択するか、マウスの右ボタンをクリックしてショートカット メニューを表示すると、システムは一連のメッセージを送信します。
ユーザーがメニュー バーの項目をアクティブにすると、所有者ウィンドウは最初に WM_SYSCOMMAND メッセージを受け取ります。 このメッセージには、ユーザーがキーボード (SC_KEYMENU) またはマウス (SC_MOUSEMENU) を使用してメニューをアクティブ化したかどうかを示すフラグが含まれています。 詳細については、「 メニューへのキーボード アクセス」を参照してください。
次に、メニューを表示する前に、 ユーザーがメニュー を表示する前にアプリケーションがメニューを変更できるように、WM_INITMENU メッセージがウィンドウ プロシージャに送信されます。 システムは、メニューのアクティブ化ごとに 1 回だけ 、WM_INITMENU メッセージを送信します。
ユーザーがサブメニューを開くメニュー項目をポイントすると、システムは、サブメニューを表示する前に 、WM_INITMENUPOPUP メッセージを所有者ウィンドウに送信します。 このメッセージは、表示される前にサブメニューを変更する機会をアプリケーションに提供します。
ユーザーが強調表示を 1 つの項目から別の項目に移動するたびに、メニューの所有者ウィンドウのウィンドウ プロシージャに 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 メッセージを送信します。