【问题标题】:How do I change POPUP Text of Menu without ID如何更改没有 ID 的菜单的弹出文本
【发布时间】:2013-11-18 02:47:48
【问题描述】:

对于许多语言,我必须动态更改菜单的弹出文本,

但是控制这个文本是没有ID的,如下代码参考资源

IDR_MENU_MAIN MENU 
BEGIN
    POPUP "File(&F)" // I want to change this
BEGIN
    MENUITEM "Open(&O)",                    ID_CURVE_FILE_NEW
    MENUITEM SEPARATOR
    MENUITEM "Recent File",                 ID_FILE_MRU_FILE1, GRAYED
    MENUITEM SEPARATOR
    MENUITEM "E&xit",                       ID_APP_EXIT
END
POPUP "Language(&L)"   // I want to change this
BEGIN
    MENUITEM "Traditional Chinese",         ID_LANGUAGE_CHT
    MENUITEM "Simplified Chinese",          ID_LANGUAGE_CHS
    MENUITEM "English",                     ID_LANGUAGE_ENG
    MENUITEM "Russian",                     ID_LANGUAGE_RUS
    MENUITEM "Korean",                      ID_LANGUAGE_KOR
    MENUITEM "Japanese",                    ID_LANGUAGE_JPN
END
POPUP "Help(&H)"    // I want to change this
BEGIN
    MENUITEM "", ID_APP_ABOUT
END
END

谢谢大家!

【问题讨论】:

    标签: visual-studio-2008 menu mfc popup


    【解决方案1】:

    以下是TRACE 的一些代码并修改弹出菜单字符串(hMenu 是主菜单的句柄);如果您的应用程序使用“新样式”菜单栏CMFCMenuBar,则需要分别在之前和之后调用m_wndMenuBar.GetHMenu()m_wndMenuBar.CreateFromMenu(hMenu, TRUE, TRUE);

    CMenu* pMenu = CMenu::FromHandle(hMenu);
    int i, nCou = pMenu->GetMenuItemCount();
    UINT uID;
    CString ss;
    for (i = 0; i < nCou; i++)
    {   uID = pMenu->GetMenuItemID(i);
        if (uID == 0) // separator
        {   TRACE(_T("----------------------\n"));
            continue;
        }
        pMenu->GetMenuString(i, ss, MF_BYPOSITION);
        if (uID == (UINT)-1)
        {   TRACE(_T("Popup '%s' "), ss);
            ss += _T("-Modified");
            pMenu->ModifyMenu(i, MF_BYPOSITION, 0, ss);
            TRACE(_T("modified to '%s' "), ss);
        }
        else
            TRACE(_T("Item  '%s', ID=%d "), ss, uID);
        TRACE(_T("\n"));
    }
    

    【讨论】:

    • 感谢您的帮助,但它不起作用,在输出窗口中显示以下消息,但它不会更改菜单弹出文本。 ------------------------------------------ 弹出“文件(&F)”已修改to 'File(&F)-Modified' Popup 'Set(&S)' 修改为 'Set(&S)-Modified' Popup 'Language(&L)' 修改为 'Language(&L)-Modified' Popup 'Help(&H)'修改为 'Help(&H)-Modified' ---------------------------------------- -- 我想也许这个 -> "pMenu->ModifyMenu(i, MF_BYPOSITION, 0, ss);"不工作
    • 您的菜单是如何托管的? [在对话框或 MFC 文档/视图结构中?使用 CToolbar 还是 CMFCToolbar?] 你如何获得hMenu
    【解决方案2】:

    我回答我的问题,更改代码

    CMenu* pMenu = CMenu::FromHandle(hMenu); 
    

    CMenu* pMenu = GetMenu();
    

    它会起作用的!非常感谢!

    【讨论】:

      【解决方案3】:

      尝试使用“setlocale”。

      例如:
      setlocale(LC_ALL, "繁体中文");
      setlocale(LC_ALL, "简体中文");
      ..
      ..

      http://msdn.microsoft.com/en-us/library/x99tb11d(v=vs.90).aspx

      【讨论】:

      • 它可能不适合我,因为我有很多文本要更改
      • @user1753112 很抱歉没有提供帮助:/
      【解决方案4】:

      这很棘手。

      我所做的是有一个与菜单栏的顶级元素匹配的枚举,然后按位置引用它们。

      那么你必须使用 MF_BYPOSITION 而不是使用 MF_BYCOMMAND 来更新它们。

      【讨论】:

      • 打扰一下,我是MFC的新手,能不能给我创建一个使用MF_BYCOMMAND的例子
      【解决方案5】:

      我的菜单是对话框和 CToolbar

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多