分割ボタンから BCN_DROPDOWN 通知を処理する方法

このトピックでは、ダイアログ プロシージャで BCN_DROPDOWN 通知に応答する方法の 1 つについて説明します。

C++ アプリケーションは、通知ヘッダーからボタンのクライアント座標を取得し、それらを画面座標に変換します。 次に、ポップアップ メニューを作成し、ボタンの下部に表示します。 例をシンプルにするために、このメニューにはキーボード ショートカットは実装されていません。

知っておくべきこと

テクノロジ

前提条件

  • C/C++
  • Windows ユーザー インターフェイス プログラミング

手順

手順 1: BCN_DROPDOWN 通知を待機します。

case BCN_DROPDOWN:
{
    NMBCDROPDOWN* pDropDown = (NMBCDROPDOWN*)lParam;
    if (pDropDown->hdr.hwndFrom = GetDlgItem(hDlg, IDC_SPLIT))
    {

手順 2: ボタンの画面座標を取得します。

ClientToScreen 関数を使用して、ボタンの左下端のウィンドウ座標を画面座標に変換します。

POINT pt;
pt.x = pDropDown->rcButton.left;
pt.y = pDropDown->rcButton.bottom;
ClientToScreen(pDropDown->hdr.hwndFrom, &pt);

手順 3: メニューを作成して項目を追加します。

CreatePopupMenu 関数を使用して、メニューを作成します。 AppendMenu 関数を使用して、メニューに項目を追加します。 IDC_MENUCOMMAND1 と IDC_MENUCOMMAND2 は、メニュー コマンド用のアプリケーション定義の定数です。

HMENU hSplitMenu = CreatePopupMenu();
AppendMenu(hSplitMenu, MF_BYPOSITION, IDC_MENUCOMMAND1, L"Menu item 1");
AppendMenu(hSplitMenu, MF_BYPOSITION, IDC_MENUCOMMAND2, L"Menu item 2");

手順 4: メニューを表示します。

TrackPopupMenu 関数は、指定された位置にショートカット メニューを表示し、メニュー上の項目の選択を追跡します。

TrackPopupMenu(hSplitMenu, TPM_LEFTALIGN | TPM_TOPALIGN, pt.x, pt.y, 0, hDlg, NULL);

コード例全体

case WM_NOTIFY:
    switch (((LPNMHDR)lParam)->code)
    {
        case BCN_DROPDOWN:
        {
            NMBCDROPDOWN* pDropDown = (NMBCDROPDOWN*)lParam;
            if (pDropDown->hdr.hwndFrom = GetDlgItem(hDlg, IDC_SPLIT))
            {

                // Get screen coordinates of the button.
                POINT pt;
                pt.x = pDropDown->rcButton.left;
                pt.y = pDropDown->rcButton.bottom;
                ClientToScreen(pDropDown->hdr.hwndFrom, &pt);
        
                // Create a menu and add items.
                HMENU hSplitMenu = CreatePopupMenu();
                AppendMenu(hSplitMenu, MF_BYPOSITION, IDC_MENUCOMMAND1, L"Menu item 1");
                AppendMenu(hSplitMenu, MF_BYPOSITION, IDC_MENUCOMMAND2, L"Menu item 2");
        
                // Display the menu.
                TrackPopupMenu(hSplitMenu, TPM_LEFTALIGN | TPM_TOPALIGN, pt.x, pt.y, 0, hDlg, NULL);
                return TRUE;
            }
            break;
        }
    }
    return FALSE;
}

BCN_DROPDOWN 通知コード

ボタンについて

ボタン コントロール リファレンス

ボタンの使用

Button