c++ - 我可以禁用菜单栏上的菜单项和/或动态显示它吗?

标签 c++ menu mfc

这是我添加到软件中的新查看菜单:

View Menu

我的编辑器(CDialog)有两种模式。此查看菜单仅适用于其中一种模式。

目前我正在禁用这样的菜单项:

CMenu* pMenu = GetMenu();
if (pMenu != nullptr)
{
    pMenu->EnableMenuItem(ID_VIEW_REFRESH, MF_BYCOMMAND | MF_GRAYED);
    CMenu* pViewMenu = pMenu->GetSubMenu(3);
    if (pViewMenu != nullptr)
        pViewMenu->EnableMenuItem(1, MF_BYPOSITION | MF_GRAYED);
}

这很好用。但有没有办法:

  • 禁用菜单栏上的实际查看菜单项?
  • 根据需要删除/添加菜单?

目前,菜单始终存在,我只是禁用依赖于事件编辑器模式的项目。它是我的资源中编辑器菜单的一部分:

POPUP "View"
BEGIN
    MENUITEM "Refresh\tF5",                 ID_VIEW_REFRESH, INACTIVE
    POPUP "Zoom", GRAYED
    BEGIN
        MENUITEM "Zoom In\tCTRL +",             ID_ZOOMLEVEL_ZOOMIN
        MENUITEM "Zoom Out\tCTRL -",            ID_ZOOMLEVEL_ZOOMOUT
        MENUITEM SEPARATOR
        MENUITEM "400%",                        ID_ZOOMLEVEL_400
        MENUITEM "300%",                        ID_ZOOMLEVEL_300
        MENUITEM "250%",                        ID_ZOOMLEVEL_250
        MENUITEM "200%",                        ID_ZOOMLEVEL_200
        MENUITEM "175%",                        ID_ZOOMLEVEL_175
        MENUITEM "150%",                        ID_ZOOMLEVEL_150
        MENUITEM "125%",                        ID_ZOOMLEVEL_125
        MENUITEM "100%\tCTRL + 0",              ID_ZOOMLEVEL_100
        MENUITEM "75%",                         ID_ZOOMLEVEL_75
        MENUITEM "50%",                         ID_ZOOMLEVEL_50
        MENUITEM SEPARATOR
        MENUITEM "Custom...",                   ID_ZOOM_CUSTOM
    END
END

这可能吗?

最佳答案

假设您的菜单名为 IDR_MAINFRAME:

enter image description here

创建您的mainFrame并添加IDR_MAINFRAME菜单:

CMainFrame* pFrame = new CMainFrame;  
pFrame->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, NULL);

您必须获得如下所示的主菜单:

CMenu menu;
menu.LoadMenu(IDR_MAINFRAME);

现在,您可以禁用特定项目:

menu.EnableMenuItem (1,  MF_BYPOSITION|MF_DISABLED|MF_GRAYED); 
pFrame->SetMenu(&menu);  

查看下面的结果:

enter image description here

请注意,Edition 是我的应用程序的主菜单(类似于“ View ”菜单)。
要动态启用菜单(View menu),请再次调用 EnableMenuItem,如下所示:

menu.EnableMenuItem (1,  MF_BYPOSITION);   

希望对你有帮助。

更新

我还必须使用此代码来使菜单栏以视觉方式更新:

DrawMenuBar();

使用此代码,直到将鼠标放在菜单文本上时,菜单才会在视觉上更新。

关于c++ - 我可以禁用菜单栏上的菜单项和/或动态显示它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60789339/

相关文章:

c++ - 公开类拥有的资源的正确方法是什么?

c++ - 临时约束需要需要需要需要?

c++ - 类型定义数组与在 C++ 中使用结构

c++ - 在 WinAPI 中创建菜单条?

mfc - 在 MFC 中重新打开模态对话框

winapi - 防止调整 ListCtrl 中第一列的大小(ReportView)

c++ - 为什么(无限)递归在 clang(和 gcc/g++)中使用 和 w/o -O3 会给出不同的结果?

jquery - 在 .Net 上使用基于 css 的菜单 website.web 添加样式

javascript - 适合屏幕底部/顶部的菜单

visual-c++ - 您应该默认 HMENU 为 nullptr 还是 0?