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

  1. Une fois votre CToolBarCtrl objet créé, définissez le style ToSTYLE_EX_DRAWDDARROWS à l’aide du code suivant :

    m_ToolBarCtrl.SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
    
  2. 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);
    
  3. Ajoutez un gestionnaire ToN_DROPDOWN à la classe parente de l’objet de barre d’outils.

    ON_NOTIFY(TBN_DROPDOWN, IDC_TOOLBAR1, &CMyDialog::OnTbnDropDownToolBar1)
    
  4. 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;
    }
    

Voir aussi

Utilisation de CToolBarCtrl
Contrôles