c - 如何使用 `FindResourceEx()` 和 `LoadResource()` 加载新菜单?

标签 c windows winapi

我正在使用 Windows API 用 C 语言开发多语言 Win32 程序。它将允许用户选择界面的语言。根据MSDN documentation , 我需要使用 FindResourceEx() + LoadResource()并且不是不可靠的SetThreadLocale() .

我的问题是:我不知道如何从资源中加载菜单。

考虑到下面的示例代码,应该如何修改它来加载和更新菜单?

HMENU hMenu = GetMenu(hWnd);
SetMenu(hWnd, NULL);
DestroyMenu(hMenu);

HRSRC rcMenu = FindResourceEx(NULL, RT_MENU, MAKEINTRESOURCE(IDM_MENU),
    MAKELANGID(LANG_AFRIKAANS, SUBLANG_AFRIKAANS_SOUTH_AFRICA));

hMenu = LoadResource(NULL, rcMenu); /* ??? HGLOBAL used as a HANDLE? */
SetMenu(hWnd, hMenu);

最佳答案

命令中建议的替代解决方案(每种语言的单独 DLL 资源文件)是一个不错的选择,我们自己也使用了一个。但是要回答你的问题:

LoadMenuIndirect() 函数允许您从资源模板创建菜单(用户对象)。它是从资源中加载的模板。

例如(没有错误检查),

HRSRC hRes = FindResourceEx(NULL, RT_MENU, MAKEINTRESOURCE(IDM_MENU),
    MAKELANGID(LANG_AFRIKAANS, SUBLANG_AFRIKAANS_SOUTH_AFRICA));
HGLOBAL hGlob = LoadResource(NULL, hRes);
LPVOID pData = LockResource(hGlob);

// create the menu
HMENU hMenu = LoadMenuIndirect((MENUTEMPLATE*)pData);

关于c - 如何使用 `FindResourceEx()` 和 `LoadResource()` 加载新菜单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41624655/

相关文章:

c++ - 使用 XSendEvent 传递鼠标事件

windows - Windows 8 中的视觉样式

linux - 共享集群与采用 Intel(R)Core™ i7 的笔记本电脑之间的性能检查

winapi - 通过 API (windows) 设置菜单热键的下划线

c++ - 从打开文件对话框获取文件夹

c - 运行 sphinx_fe 时出现段错误 -- strlen.S : No such file

c - C语言中枚举的使用?

c - 保持前导零 C

c++ - 知道 CPU 是否支持纳秒

c++ - 如何更改按钮的背景颜色 WinAPI C++