如何手动显示CMFCToolBarComboBoxButton子菜单

How to manually show CMFCToolBarComboBoxButton sub-menu?

本文关键字:菜单 CMFCToolBarComboBoxButton 显示 何手动      更新时间:2023-10-16

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);

我已经环顾四周一段时间了,找不到相关的答案。

解决方案恰好非常简单,只需从其关联的ON_COMMAND调用CMFCToolBarComboBoxButton按钮的OnClick函数即可。

// ... 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可以用于非常不同的目的,例如默认操作,而子菜单包含其他不太常见的选项。