Behandeln der BCN_DROPDOWN Benachrichtigung über eine Geteilte 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 keine Tastenkombinationen für das Menü implementiert.
Wichtige Informationen
Technologien
Voraussetzungen
- C/C++
- Programmierung der Windows-Benutzeroberfläche
Anweisungen
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 Funktion CreatePopupMenu , 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 Funktion TrackPopupMenu zeigt ein Kontextmenü an der angegebenen Position an und verfolgt die Auswahl der Elemente im Menü.
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;
}
Zugehörige Themen