0

的标准行为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);

我一直在四处寻找,找不到相关的答案。

4

1 回答 1

0

解决方案恰好非常简单,只需从其关联OnClick的.CMFCToolBarComboBoxButtonON_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可以用于非常不同的目的,例如默认操作,而子菜单包含其他不太常见的选项。

于 2019-01-28T16:45:05.217 回答