Partilhar via


Usando botões suspensos em um controle de barra de ferramentas

Além dos botões de ação padrão, uma barra de ferramentas também pode ter botões suspensos. Um botão suspenso geralmente é indicado pela presença de uma seta para baixo anexada.

Observação

A seta para baixo anexada será exibida somente se o estilo estendido TBSTYLE_EX_DRAWDDARROWS tiver sido definido.

Quando o usuário clica nessa seta (ou no próprio botão, se nenhuma seta estiver presente), uma mensagem de notificação TBN_DROPDOWN é enviada para o pai do controle da barra de ferramentas. Em seguida, você pode manipular essa notificação e exibir um menu pop-up; semelhante ao comportamento do Internet Explorer.

O procedimento a seguir ilustra como implementar um botão de barra de ferramentas suspenso com um menu pop-up:

Para implementar um botão suspenso

  1. Depois que o objeto CToolBarCtrl tiver sido criado, defina o estilo TBSTYLE_EX_DRAWDDARROWS usando o seguinte código:

    m_ToolBarCtrl.SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
    
  2. Defina o estilo TBSTYLE_DROPDOWN para qualquer botão novo (InsertButton ou AddButtons) ou existente (SetButtonInfo) que será um botão suspenso. O exemplo a seguir demonstra a modificação de um botão existente em um 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);
    
  3. Adicione um manipulador TBN_DROPDOWN à classe pai do objeto da barra de ferramentas.

    ON_NOTIFY(TBN_DROPDOWN, IDC_TOOLBAR1, &CMyDialog::OnTbnDropDownToolBar1)
    
  4. No novo manipulador, exiba o menu pop-up apropriado. O código a seguir demonstra um 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;
    }
    

Confira também

Usando CToolBarCtrl
Controles