【问题标题】:Can I disable a menu item on the menu bar and / or dynamically display it?我可以禁用菜单栏上的菜单项和/或动态显示它吗?
【发布时间】:2020-03-21 15:00:41
【问题描述】:

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

我的编辑器(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

这可能吗?

【问题讨论】:

    标签: c++ menu mfc


    【解决方案1】:

    假设您的菜单名为IDR_MAINFRAME

    创建您的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);  
    

    查看以下结果:

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

    menu.EnableMenuItem (1,  MF_BYPOSITION);   
    

    希望对你有帮助。

    更新

    我还必须使用这段代码来让菜单栏在视觉上更新:

    DrawMenuBar();
    

    使用此代码,在鼠标放在菜单文本上之前,菜单不会在视觉上更新。

    【讨论】:

      【解决方案2】:

      当然,要禁用项目,使用 GetMenu 检索菜单句柄,然后使用 EnableMenuItem API 并指定 MF_BYPOSITION 而不是 MF_BYCOMMAND。

      或者您可以使用 MENUEX 资源并为弹出菜单项分配一个 ID(不幸的是,资源编辑器无法保存 MENUEX 资源,它可以读取它们但始终保存为 MENU)。如果你想改成 MENUEX 把它放在 MFC 项目的 .rc2 文件中。

      【讨论】:

      • 所以就像我对 Zoom 弹出窗口所做的那样,我可以直接对 View 菜单执行操作。我会试试的,谢谢。我不知道 MENUX 方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多