Come gestire la notifica BCN_DROPDOWN da un pulsante di divisione

In questo argomento viene descritto un modo possibile per rispondere alla notifica di BCN_DROPDOWN in una procedura di dialogo.

L'applicazione C++ recupera le coordinate client del pulsante dall'intestazione di notifica e le converte in coordinate dello schermo. Crea quindi un menu popup e lo visualizza nella parte inferiore del pulsante. Per mantenere l'esempio semplice, i tasti di scelta rapida non vengono implementati per il menu.

Informazioni importanti

Tecnologie

Prerequisiti

  • C/C++
  • Programmazione dell'interfaccia utente di Windows

Istruzioni

Passaggio 1: Attendere la notifica di BCN_DROPDOWN .

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

Passaggio 2: Ottenere le coordinate dello schermo del pulsante.

Usare la funzione ClientToScreen per convertire le coordinate della finestra del bordo inferiore sinistro del pulsante in coordinate dello schermo.

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

Passaggio 3: Creare un menu e aggiungere voci.

Usare la funzione CreatePopupMenu per creare un menu. Utilizzare la funzione AppendMenu per aggiungere elementi al menu. IDC_MENUCOMMAND1 e IDC_MENUCOMMAND2 sono costanti definite dall'applicazione per i comandi di menu.

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

Passaggio 4: Visualizzare il menu.

La funzione TrackPopupMenu visualizza un menu di scelta rapida nella posizione specificata e tiene traccia della selezione delle voci nel menu.

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

Esempio completo

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 codice di notifica

Informazioni sui pulsanti

Informazioni di riferimento sul controllo Pulsante

Uso dei pulsanti

Button