Compartir vía


Cómo controlar botones desplegables

Un botón desplegable puede presentar a los usuarios una lista de opciones. Para crear este estilo de botón, especifique el estilo de BTNS_DROPDOWN (también denominado TBSTYLE_DROPDOWN para la compatibilidad con versiones anteriores de los controles comunes). Para mostrar un botón desplegable con una flecha, también debe establecer el estilo de TBSTYLE_EX_DRAWDDARROWS barra de herramientas enviando un mensaje TB_SETEXTENDEDSTYLE .

En la ilustración siguiente se muestra un botón desplegable "Abrir" con el menú contextual abierto y mostrando una lista de archivos. En este ejemplo, la barra de herramientas tiene el estilo TBSTYLE_EX_DRAWDDARROWS .

captura de pantalla de un cuadro de diálogo con tres elementos de barra de herramientas representados por iconos; uno tiene una flecha desplegable expandida y un menú contextual de tres elementos

En la ilustración siguiente se muestra la misma barra de herramientas, esta vez sin el estilo TBSTYLE_EX_DRAWDDARROWS .

captura de pantalla de un cuadro de diálogo anterior, pero el icono con el menú contextual no tiene ninguna flecha desplegable

Cuando los usuarios hacen clic en un botón de barra de herramientas que usa el estilo BTNS_DROPDOWN , el control de barra de herramientas envía a su ventana primaria un código de notificación TBN_DROPDOWN .

Lo que necesita saber

Tecnologías

Requisitos previos

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

Instrucciones

Controlar un botón desplegable

En el ejemplo de código siguiente se muestra cómo una aplicación puede admitir un botón desplegable en un control de barra de herramientas.

BOOL DoNotify(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{

    #define lpnm   ((LPNMHDR)lParam)
    #define lpnmTB ((LPNMTOOLBAR)lParam)

    switch(lpnm->code)
    {
        case TBN_DROPDOWN:
        {
            // Get the coordinates of the button.
            RECT rc;
            SendMessage(lpnmTB->hdr.hwndFrom, TB_GETRECT, (WPARAM)lpnmTB->iItem, (LPARAM)&rc);

            // Convert to screen coordinates.            
            MapWindowPoints(lpnmTB->hdr.hwndFrom, HWND_DESKTOP, (LPPOINT)&rc, 2);                         
        
            // Get the menu.
            HMENU hMenuLoaded = LoadMenu(g_hinst, MAKEINTRESOURCE(IDR_POPUP)); 
         
            // Get the submenu for the first menu item.
            HMENU hPopupMenu = GetSubMenu(hMenuLoaded, 0);

            // Set up the pop-up menu.
            // In case the toolbar is too close to the bottom of the screen, 
            // set rcExclude equal to the button rectangle and the menu will appear above 
            // the button, and not below it.
         
            TPMPARAMS tpm;
         
            tpm.cbSize    = sizeof(TPMPARAMS);
            tpm.rcExclude = rc;
         
            // Show the menu and wait for input. 
            // If the user selects an item, its WM_COMMAND is sent.
         
            TrackPopupMenuEx(hPopupMenu, 
                             TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL, 
                             rc.left, rc.bottom, g_hwndMain, &tpm);

            DestroyMenu(hMenuLoaded);
         
        return (FALSE);
      
        }
    }
   
    return FALSE;
}

Usar controles de barra de herramientas

Demostración de controles comunes de Windows (CppWindowsCommonControls)