Partager via


Comment gérer la notification BCN_DROPDOWN à partir d’un bouton fractionné

Cette rubrique décrit une façon possible de répondre à la notification BCN_DROPDOWN dans une procédure de dialogue.

L’application C++ récupère les coordonnées du client du bouton à partir de l’en-tête de notification et les convertit en coordonnées d’écran. Il crée ensuite un menu contextuel et l’affiche en bas du bouton. Pour simplifier l’exemple, les raccourcis clavier ne sont pas implémentés pour le menu.

Ce que vous devez savoir

Technologies

Conditions préalables

  • C/C++
  • Programmation de l’interface utilisateur Windows

Instructions

Étape 1 : attendez la notification BCN_DROPDOWN.

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

Étape 2 : Obtenir les coordonnées de l’écran du bouton.

Utilisez la fonctionClientToScreenpour convertir les coordonnées de la fenêtre du bord inférieur gauche du bouton en coordonnées d’écran.

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

Étape 3 : Créer un menu et ajouter des éléments.

Utilisez la fonction CreatePopupMenu pour créer un menu. Utilisez la fonction AppendMenu pour ajouter des éléments au menu. IDC_MENUCOMMAND1 et IDC_MENUCOMMAND2 sont des constantes définies par l’application pour les commandes de menu.

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

Étape 4 : Afficher le menu.

La fonction TrackPopupMenu affiche un menu contextuel à l’emplacement spécifié et effectue le suivi de la sélection d’éléments dans le menu.

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

Exemple complet

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

code de notification BCN_DROPDOWN

À propos des boutons

de référence de contrôle de bouton

utiliser des boutons

bouton