Utilisation de boutons de liste déroulante dans un contrôle ToolBar
En plus des boutons push standard, une barre d’outils peut également avoir des boutons déroulants. Un bouton déroulant est généralement indiqué par la présence d’une flèche vers le bas attachée.
Remarque
La flèche vers le bas attachée s’affiche uniquement si le style étendu ToSTYLE_EX_DRAWDDARROWS a été défini.
Lorsque l’utilisateur clique sur cette flèche (ou le bouton lui-même, si aucune flèche n’est présente), un message de notification ToN_DROPDOWN est envoyé au parent du contrôle de barre d’outils. Vous pouvez ensuite gérer cette notification et afficher un menu contextuel ; similaire au comportement d’Internet Explorer.
La procédure suivante montre comment implémenter un bouton de barre d’outils déroulant avec un menu contextuel :
Pour implémenter un bouton déroulant
Une fois votre
CToolBarCtrl
objet créé, définissez le style ToSTYLE_EX_DRAWDDARROWS à l’aide du code suivant :m_ToolBarCtrl.SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
Définissez le style ToSTYLE_DROPDOWN pour les nouveaux boutons (InsertButton ou AddButtons) ou existants (SetButtonInfo) qui seront des boutons déroulants. L’exemple suivant illustre la modification d’un bouton existant dans un
CToolBarCtrl
objet :TBBUTTONINFO tbi; tbi.dwMask = TBIF_STYLE; tbi.cbSize = sizeof(TBBUTTONINFO); m_ToolBarCtrl.GetButtonInfo(0, &tbi); tbi.fsStyle |= TBSTYLE_DROPDOWN; m_ToolBarCtrl.SetButtonInfo(0, &tbi);
Ajoutez un gestionnaire ToN_DROPDOWN à la classe parente de l’objet de barre d’outils.
ON_NOTIFY(TBN_DROPDOWN, IDC_TOOLBAR1, &CMyDialog::OnTbnDropDownToolBar1)
Dans le nouveau gestionnaire, affichez le menu contextuel approprié. Le code suivant illustre une méthode :
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; }