如何以编程方式显示功能区按钮的下拉菜单?
How to programmatically show dropdown-menu of ribbon button?
我有一个功能区按钮,添加了一组子项目。当用户单击按钮下方的小箭头时,将显示此类项目。我想在单击按钮本身时显示这样的下拉菜单。我该怎么做?
我最初的想法是在用户单击按钮时以编程方式显示菜单。我已经能够在工具栏上做同样的事情(这里(,但是在功能区上使用类似的解决方案会产生无限递归:
// ...
ON_COMMAND(ID_RIBBON_BUTTON, &MainFrame::OnButtonClicked)
// ...
CMFCRibbonPanel *panel = /* initialization */
CMFCRibbonButton *button = new CMFCRibbonButton(ID_RIBBON_BUTTON, "Caption");
panel->Add(button);
CMFCRibbonButton *item1 = new CMFCRibbonButton(ID_RIBBON_BUTTON, "Item 1");
button->AddSubItem(item1);
CMFCRibbonButton *item2 = new CMFCRibbonButton(ID_RIBBON_BUTTON, "Item 2");
button->AddSubItem(item2);
// ...
void MainFrame::OnButtonClicked()
{
if (auto button = static_cast<CMFCRibbonButton *>(m_ribbons.wndRibbonBar.FindByID(ID_RIBBON_BUTTON))) {
// button->OnClick({}); // <- causes infinite recursion
// What to do here?
}
}
如果创建一个空白的弹出子菜单并附加到该按钮,则该按钮将按您的要求工作,同时显示之前添加为子项的按钮。
CMenu map_menu;
map_menu.CreateMenu();
button->SetHMenu(map_menu.GetSafeHmenu());
到目前为止,我发现的最简单方法是使用受保护的方法CMFCRibbonButton::OnShowPopupMenu
。这意味着派生CMFCRibbonButton
类并更改方法的可见性:
#include <afxribbonbutton.h>
class CMyMFCRibbonButton : public CMFCRibbonButton {
public:
using CMFCRibbonButton::CMFCRibbonButton;
virtual void OnShowPopupMenu() override {
CMFCRibbonButton::OnShowPopupMenu();
}
};
// ...
ON_COMMAND(ID_RIBBON_BUTTON, &MainFrame::OnButtonClicked)
// ...
CMFCRibbonPanel *panel = /* initialization */
CMyMFCRibbonButton *button = new CMyMFCRibbonButton(ID_RIBBON_BUTTON, "Caption");
panel->Add(button);
CMFCRibbonButton *item1 = new CMFCRibbonButton(ID_RIBBON_BUTTON, "Item 1");
button->AddSubItem(item1);
CMFCRibbonButton *item2 = new CMFCRibbonButton(ID_RIBBON_BUTTON, "Item 2");
button->AddSubItem(item2);
// ...
void MainFrame::OnButtonClicked()
{
if (auto button = static_cast<CMyMFCRibbonButton*>(m_ribbons.wndRibbonBar.FindByID(ID_RIBBON_BUTTON))) {
button->OnShowPopupMenu();
}
}
相关文章:
- MFC/C++ ComboBox:禁用下拉列表关闭和打开(UI 冻结)的绘制
- 如何以编程方式显示功能区按钮的下拉菜单?
- 我在窗口中有一个fltk Fl_Choice下拉菜单,但只能通过鼠标使用
- Visual Studio MFC C++ "CFormView" "base class"下拉列表中缺少
- CMake 库目标并不总是出现在 Visual Studio 2017 的"启动项"下拉列表中。
- 点击QComboBox的下拉列表
- Qt驱动器下拉列表仅列出USB记忆棒
- Visual Studio 是否有具有多个下拉框的编译模式?
- 如何使用 3 个按钮对 Arduino 菜单进行编程?
- 带有下拉菜单的wx工具栏:对所选项目没有反应
- Win32 工具栏下拉按钮消息处理
- MFC 组合框下拉列表:仅显示一个项目
- 在自定义组合框下拉列表控件上等待超过5秒会导致win32 C++应用程序在Windows7中挂起
- 使用水平滚动条手动设置 MFC CComboBox 下拉列表高度
- QT以编程方式制作下拉菜单小部件
- 可视化的“自动”下拉菜单,使用C++单击按钮
- 如何覆盖已定义类型的 ostream <<运算符 如何使下拉子菜单直接显示在其父菜单下方<li>?
- Qt菜单栏没有下拉菜单(单级菜单栏)
- QComboBox:我们能让整个组合框都可以点击,而不仅仅是下拉按钮(箭头)本身吗
- Visual Studio下拉菜单中显示为灰色的类方法