Как вручную показать подменю CMFCToolBarComboBoxButton?

Стандартное поведение для 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 ответ

Решение

Решение оказалось очень простым, просто позвоните 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 может использоваться для совершенно других целей, таких как действие по умолчанию, в то время как подменю содержит другие менее частые параметры.

Другие вопросы по тегам