【问题标题】:Get id for popup resource menu item in c++ mfc vs2015在c ++ mfc vs2015中获取弹出资源菜单项的ID
【发布时间】:2018-08-22 12:11:04
【问题描述】:

我正在本地化一个 mfc 应用程序。我的方法是创建一个仅资源的 dll,其中包含 gui 的翻译副本。我的问题是源代码中有一些地方是通过它们的字符串名称找到弹出资源的。由于我已将这些字符串翻译成另一种语言,因此这些函数不再起作用。我对此的预期解决方案是通过 ID 查找这些元素,但是当我尝试这样做时,我发现它们似乎没有唯一的 ID。

请参阅下面我正在使用的 .rc 文件的 sn-p,并注意弹出资源和操作没有 id:

IDR_MAINFRAME MENU
BEGIN
    POPUP "&Action"
    BEGIN
        MENUITEM "&Tracking Start\tF2",         ID_TRACKING_START
        MENUITEM "Record...\tCtrl+R",           ID_RECORDING_STREAMTOFILE
        MENUITEM "Mouse Control Start\tF9",     ID_ACTION_MOUSECONTROL
        MENUITEM "Reflex Reduction\tF12",       ID_REFLEXREDUCTION_TOGGLE
        POPUP "Text &Log"
        BEGIN
            MENUITEM "Select Log&file...",          ID_LOGGING_FILE
            MENUITEM "Start &Logging\tF6",          ID_LOGGING_LOG
        END
        MENUITEM SEPARATOR
        MENUITEM "E&xit\tAlt+F4",               ID_APP_EXIT
    END
END

下面还有一个 sn-p,用于通过字符串名称查找 UI 元素的代码

int CMainFrame::FindMenuItem(CMenu* Menu, LPCTSTR MenuString)
{
  ASSERT(Menu);
  ASSERT(::IsMenu(Menu->GetSafeHmenu()));

  int count = Menu->GetMenuItemCount();
  for (int i = 0; i < count; i++)
  {
    CString str;
    if (Menu->GetMenuString(i, str, MF_BYPOSITION) && (strcmp(str, 
MenuString) == 0))
   {
     return i;
   }
 }
return -1;
}

经过一番谷歌搜索后,我发现了一个名为 MENUEX https://docs.microsoft.com/en-us/windows/desktop/menurc/menuex-resource 的东西,您似乎可以将 ID 添加到弹出资源元素中。然而,当我尝试将 .rc 文件更改为使用 MENUEX 而不是 MENU 时,我的 vs2015 编译器根本没有批准,现在我有点卡住了。

提前感谢任何对如何解决我的问题有任何想法的人!

【问题讨论】:

  • 通过第一个子 MENUITEM ID 查找弹出菜单怎么样?
  • 您的资源 DLL 中有“字符串”部分吗?如果是这样,您可以针对翻译后的字符串进行比较(通过让调用者负责加载正确的字符串,或者通过更改 API 以传入字符串 ID,然后在函数中加载字符串。)跨度>
  • @MartinBonner 这会起作用,但它很脆弱,因为如果您更改菜单名称并且忘记更改相应的字符串,您会破坏应用程序。我认为 Alex F 的想法更好。

标签: c++ winapi localization mfc popup


【解决方案1】:

只是想提供一个更新,并且我能够用 Alex F 的想法解决我的问题。谢谢亚历克斯!但是我想补充一点,我并没有真正找到令人满意的解决方案,但我猜这是 mfc 的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多