Compartir a través de


Usar botones desplegables en un control de barra de herramientas

Además de los botones de pulsación estándar, una barra de herramientas también puede tener botones desplegables. Normalmente, un botón desplegable se indica mediante la presencia de una flecha hacia abajo adjunta.

Nota:

La flecha hacia abajo adjunta solo aparecerá si se ha establecido el TBSTYLE_EX_DRAWDDARROWS estilo extendido.

Cuando el usuario hace clic en esta flecha (o en el propio botón, si no hay ninguna flecha), se envía un mensaje de notificación TBN_DROPDOWN al elemento primario del control de barra de herramientas. A continuación, puede controlar esta notificación y mostrar un menú emergente; similar al comportamiento de Internet Explorer.

En el procedimiento siguiente se muestra cómo implementar un botón de barra de herramientas desplegable con un menú emergente:

Para implementar un botón desplegable

  1. CToolBarCtrl Una vez creado el objeto, establezca el estilo TBSTYLE_EX_DRAWDDARROWS con el código siguiente:

    m_ToolBarCtrl.SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
    
  2. Establezca el estilo de TBSTYLE_DROPDOWN para los botones nuevos (InsertButton o AddButtons) o existentes (SetButtonInfo) que serán botones desplegables. En el ejemplo siguiente se muestra cómo modificar un botón existente en un CToolBarCtrl objeto :

    TBBUTTONINFO tbi;
    
    tbi.dwMask = TBIF_STYLE;
    tbi.cbSize = sizeof(TBBUTTONINFO);
    m_ToolBarCtrl.GetButtonInfo(0, &tbi);
    tbi.fsStyle |= TBSTYLE_DROPDOWN;
    m_ToolBarCtrl.SetButtonInfo(0, &tbi);
    
  3. Agregue un controlador TBN_DROPDOWN a la clase primaria del objeto de barra de herramientas.

    ON_NOTIFY(TBN_DROPDOWN, IDC_TOOLBAR1, &CMyDialog::OnTbnDropDownToolBar1)
    
  4. En el nuevo controlador, muestre el menú emergente adecuado. El código siguiente muestra un método:

    void CMyDialog::OnTbnDropDownToolBar1(NMHDR *pNMHDR, LRESULT *pResult)
    {
       LPNMTOOLBAR pToolBar = reinterpret_cast<LPNMTOOLBAR>(pNMHDR);
       ClientToScreen(&(pToolBar->rcButton)); // TrackPopupMenu uses screen coords
    
       CMenu menu;
       VERIFY(menu.LoadMenu(IDR_MENU1));
       CMenu *pPopup = menu.GetSubMenu(0);
       if (NULL != pPopup)
       {
          pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
                                 pToolBar->rcButton.left, pToolBar->rcButton.bottom, this);
       }
    
       *pResult = 0;
    }
    

Consulte también

Uso de CToolBarCtrl
Mandos