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 boîte de dialogue.
L’application C++ récupère les coordonnées 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.
Bon à savoir
Technologies
Prérequis
- 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 d’écran du bouton.
Utilisez la fonction ClientToScreen pour convertir les coordonnées de 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 des é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;
}
Rubriques connexes