Behandeln der _ BCN-DROPDOWN-Benachrichtigung über eine unterteilte Schaltfläche

In diesem Thema wird eine mögliche Möglichkeit beschrieben, auf die _ BCN-DROPDOWN-Benachrichtigung in einer Dialogprozedur zu reagieren.

Die C++-Anwendung ruft die Clientkoordinaten der Schaltfläche aus dem Benachrichtigungsheader ab und konvertiert sie in Bildschirmkoordinaten. Anschließend wird ein Popupmenü erstellt und am unteren Rand der Schaltfläche angezeigt. Um das Beispiel einfach zu halten, werden Tastenkombinationen für das Menü nicht implementiert.

Wichtige Informationen

Technologien

Voraussetzungen

  • C/C++
  • Windows Benutzeroberfläche-Programmierung

Instructions

Schritt 1: Warten Sie auf die _ BCN-DROPDOWN-Benachrichtigung.

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

Schritt 2: Abrufen der Bildschirmkoordinaten der Schaltfläche.

Verwenden Sie die ClientToScreen-Funktion, um die Fensterkoordinaten des unteren linken Rands der Schaltfläche in Bildschirmkoordinaten zu konvertieren.

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

Schritt 3: Erstellen sie ein Menü, und fügen Sie Elemente hinzu.

Verwenden Sie die CreatePopupMenu-Funktion, um ein Menü zu erstellen. Verwenden Sie die AppendMenu-Funktion, um dem Menü Elemente hinzuzufügen. IDC _ MENUCOMMAND1 und IDC _ MENUCOMMAND2 sind anwendungsdefinierte Konstanten für Menübefehle.

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

Schritt 4: Anzeigen des Menüs.

Die TrackPopupMenu-Funktion zeigt ein Kontextmenü an der angegebenen Position an und verfolgt die Auswahl von Elementen im Menü nach.

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

Vollständiges Beispiel

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-Benachrichtigungscode

Informationen zu Schaltflächen

Referenz zum Schaltflächensteuerelement

Verwenden von Schaltflächen

Schaltfläche