Compartir a través de


Cómo controlar la notificación de BCN_DROPDOWN desde un botón de división

En este tema se describe una forma posible de responder a la notificación de BCN_DROPDOWN en un procedimiento de diálogo.

La aplicación de C++ recupera las coordenadas de cliente del botón del encabezado de notificación y las convierte en coordenadas de pantalla. A continuación, crea un menú emergente y lo muestra en la parte inferior del botón. Para simplificar el ejemplo, los métodos abreviados de teclado no se implementan para el menú.

Lo que necesita saber

Tecnologías

Requisitos previos

  • C/C++
  • Programación de la interfaz de usuario de Windows

Instrucciones

Paso 1: Espere la notificación de BCN_DROPDOWN .

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

Paso 2: Obtener las coordenadas de pantalla del botón.

Use la función ClientToScreen para convertir las coordenadas de ventana del borde inferior izquierdo del botón en coordenadas de pantalla.

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

Paso 3: Crear un menú y agregar elementos.

Use la función CreatePopupMenu para crear un menú. Use la función AppendMenu para agregar elementos al menú. IDC_MENUCOMMAND1 y IDC_MENUCOMMAND2 son constantes definidas por la aplicación para los comandos de menú.

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

Paso 4: Mostrar el menú.

La función TrackPopupMenu muestra un menú contextual en la ubicación especificada y realiza un seguimiento de la selección de elementos en el menú.

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

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

código de notificación de BCN_DROPDOWN

Acerca de los botones

Referencia de control de botón

Usar botones

Button