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;
}