c++ - 如何以编程方式显示功能区按钮的下拉菜单?
问题描述
我有添加了一组子项目的功能区按钮。当用户单击按钮下方的小箭头时,会显示此类项目。我想在单击按钮本身时显示这样的下拉菜单。我怎样才能做到这一点?
我最初的想法是在用户单击按钮时以编程方式显示菜单。我已经能够在工具栏(这里)上做同样的事情,但是在功能区上使用类似的解决方案会产生无限递归:
// ...
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?
}
}
解决方案
到目前为止,我发现的最简单的方法是使用 protected 方法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();
}
}
推荐阅读
- java - JBoss Wildfly 16.0.0.Final 定制版本的 Docker 映像
- java - 为什么我的 Go 数组排序代码比 Java 慢得多?
- c# - windows认证和个人认证在一个项目中
- php - PHP 计算日期、小时和分钟时出错?
- linux - 重命名与目录同名的文件 - bash 脚本
- exception - aarch64 异常级别从 EL1 切换到 EL0
- ag-grid - AG-Grid - 如何动态增加行高?
- java - Websockets使用Too Tall Nate Java库与代码-1断开连接
- javascript - 如何在 amchrts 图例中应用水平对齐?
- vuetify.js - Vuetify - 底部对齐文本字段