Как вручную показать подменю CMFCToolBarComboBoxButton? - PullRequest
0 голосов
/ 28 января 2019

Стандартное поведение для CMFCToolBarComboBoxButton состоит в том, чтобы иметь нажимаемую кнопку плюс стрелку раскрывающегося списка для отображения подменю.Я хочу показать подменю независимо от того, где был сделан клик.Как я могу это сделать?

Мой код для создания кнопки, более или менее, следующий (он был извлечен из более крупного проекта, поэтому я прошу прощения за отсутствующий не слишком важный фрагмент кода):

// In class declaration:
CMenu m_menu;
CMFCToolBar m_toolbar;

// Where toolbar initialization takes place:
m_menu.CreateMenu();
// ... populate menu

// ID_BUTTON is the ID in the resource file for the toolbar button, 0 is the index for the button icon
CMFCToolBarMenuButton button(ID_BUTTON, m_menu.GetSafeHmenu(), 0);
m_toolbar.ReplaceButton(ID_BUTTON, button);

Я некоторое время искал и не могу найти соответствующий ответ.

1 Ответ

0 голосов
/ 28 января 2019

Решение оказалось очень простым, просто вызовите функцию OnClick кнопки CMFCToolBarComboBoxButton из соответствующей ON_COMMAND.

// ... message map
ON_COMMAND(ID_BUTTON, OnToolbarMenuButtonClicked)
// ...

void MyWnd::OnToolbarMenuButtonClicked()
{
  const int index = m_toolbar.CommandToIndex(ID_BUTTON);
  auto button = (CMFCToolBarComboBoxButton*)m_toolbar.GetButton(index);
  button->OnClick(NULL, TRUE);
}

Это поведение незадокументировано и, вопреки здравому смыслу, не создает бесконечного рекурсивного вызова.Кажется, что «основная» кнопка все еще контролируется CMFCToolBarButton, в то время как только «кнопка со стрелкой» управляется CMFCToolBarComboBoxButton.

PS: очевидно, и выходит за рамки вопросаOnToolbarMenuButtonClicked может использоваться для совершенно других целей, таких как действие по умолчанию, в то время как подменю содержит другие менее частые параметры.

...