Usar botones desplegables en un control de barra de herramientas
Además de los botones de inserció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 abajo adjunta.
Nota:
La flecha abajo adjunta solo aparecerá si se ha establecido el estilo extendido TBSTYLE_EX_DRAWDDARROWS.
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 la barra de herramientas. Después, 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
Una vez creado el objeto
CToolBarCtrl
, establezca el estilo TBSTYLE_EX_DRAWDDARROWS, con el código siguiente:m_ToolBarCtrl.SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
Establezca el estilo 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 objeto
CToolBarCtrl
:TBBUTTONINFO tbi; tbi.dwMask = TBIF_STYLE; tbi.cbSize = sizeof(TBBUTTONINFO); m_ToolBarCtrl.GetButtonInfo(0, &tbi); tbi.fsStyle |= TBSTYLE_DROPDOWN; m_ToolBarCtrl.SetButtonInfo(0, &tbi);
Agregue un controlador TBN_DROPDOWN a la clase primaria del objeto de barra de herramientas.
ON_NOTIFY(TBN_DROPDOWN, IDC_TOOLBAR1, &CMyDialog::OnTbnDropDownToolBar1)
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; }