Verwenden von DropDown-Schaltflächen in einem Symbolleisten-Steuerelement
Neben standardmäßigen Pushtasten kann eine Symbolleiste auch Dropdownschaltflächen enthalten. Eine Dropdownschaltfläche wird in der Regel durch das Vorhandensein eines angefügten Abwärtspfeils angezeigt.
Hinweis
Der angefügte Abwärtspfeil wird nur angezeigt, wenn die TBSTYLE_EX_DRAWDDARROWS erweiterte Formatvorlage festgelegt wurde.
Wenn der Benutzer auf diesen Pfeil klickt (oder auf die Schaltfläche selbst, wenn kein Pfeil vorhanden ist), wird eine TBN_DROPDOWN Benachrichtigung an das übergeordnete Element des Symbolleistensteuerelements gesendet. Sie können diese Benachrichtigung dann behandeln und ein Popupmenü anzeigen. ähnlich dem Verhalten von Internet Explorer.
Das folgende Verfahren veranschaulicht, wie Sie eine Dropdownsymbolleistenschaltfläche mit einem Popupmenü implementieren:
So implementieren Sie eine Dropdownschaltfläche
Nachdem Das
CToolBarCtrl
Objekt erstellt wurde, legen Sie die TBSTYLE_EX_DRAWDDARROWS Formatvorlage mithilfe des folgenden Codes fest:m_ToolBarCtrl.SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
Legen Sie die TBSTYLE_DROPDOWN Formatvorlage für neue Schaltflächen (InsertButton oder AddButtons) oder vorhandene (SetButtonInfo)-Schaltflächen fest, die Dropdownschaltflächen sind. Im folgenden Beispiel wird das Ändern einer vorhandenen Schaltfläche in einem
CToolBarCtrl
Objekt veranschaulicht:TBBUTTONINFO tbi; tbi.dwMask = TBIF_STYLE; tbi.cbSize = sizeof(TBBUTTONINFO); m_ToolBarCtrl.GetButtonInfo(0, &tbi); tbi.fsStyle |= TBSTYLE_DROPDOWN; m_ToolBarCtrl.SetButtonInfo(0, &tbi);
Fügen Sie der übergeordneten Klasse des Symbolleistenobjekts einen TBN_DROPDOWN Handler hinzu.
ON_NOTIFY(TBN_DROPDOWN, IDC_TOOLBAR1, &CMyDialog::OnTbnDropDownToolBar1)
Zeigen Sie im neuen Handler das entsprechende Popupmenü an. Der folgende Code veranschaulicht eine Methode:
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; }