如何手动显示 CMFCToolBarComboBoxButton 子菜单?

How to manually show CMFCToolBarComboBoxButton sub-menu?

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

找了半天没找到相关的答案。

解决方案非常简单,只需调用 CMFCToolBarComboBoxButton 按钮关联的 ON_COMMAND 按钮的 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);
}

此行为没有记录,而且与常识告诉我的相反,它不会创建无限递归调用。 "main"按钮似乎仍然由CMFCToolBarButton控制,而只有"arrow-button"按钮由CMFCToolBarComboBoxButton控制。

PS:显然,并且超出了问题的范围,OnToolbarMenuButtonClicked 可以用于非常不同的目的,例如默认操作,而子菜单包含其他较少-常用选项。