Hantera BCN_DROPDOWN-meddelandet från en delningsknapp

I det här avsnittet beskrivs ett möjligt sätt att svara på BCN_DROPDOWN-meddelandet i en dialogprocedur.

C++-programmet hämtar knappens klientkoordinater från meddelandehuvudet och konverterar dem till skärmkoordinater. Den skapar sedan en popup-meny och visar den längst ned på knappen. För att hålla exemplet enkelt implementeras inte kortkommandon för menyn.

Vad du behöver veta

Teknologier

Förutsättningar

  • C/C++
  • Programmering av Windows-användargränssnitt

Instruktioner

Steg 1: Vänta tills meddelandet BCN_DROPDOWN.

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

Steg 2: Hämta knappens skärmkoordinater.

Använd funktionen ClientToScreen för att konvertera fönsterkoordinaterna för knappens nedre vänstra kant till skärmkoordinater.

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

Steg 3: Skapa en meny och lägg till objekt.

Använd funktionen CreatePopupMenu för att skapa en meny. Använd funktionen AppendMenu för att lägga till objekt på menyn. IDC_MENUCOMMAND1 och IDC_MENUCOMMAND2 är programdefinierade konstanter för menykommandon.

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

Steg 4: Visa menyn.

Funktionen TrackPopupMenu visar en snabbmeny på den angivna platsen och spårar valet av objekt på menyn.

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

Fullständigt exempel

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 Meddelandekod

Om knappar

referens för knappkontroll

med knappar

knapp