Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用resource.rc中指定的不同语言构建应用程序_C++_Winapi_Visual C++ - Fatal编程技术网

C++ 使用resource.rc中指定的不同语言构建应用程序

C++ 使用resource.rc中指定的不同语言构建应用程序,c++,winapi,visual-c++,C++,Winapi,Visual C++,我从来没有做过这样的事,所以这是我第一次尝试。从网上阅读不同的信息和教程,我可以自信地说,我感到非常困惑,所以我自己去做这件事 我试图实现的是为GUI提供不同语言的不同构建配置 我的应用程序是使用Visual Studio 2019构建的Win32 我尝试了以下步骤: 克隆了我现有的发布版本 在记事本++中打开我的.rc文件并克隆了“默认”语言 部分 更改了克隆节(语言)中的语言宏 朗朗(越南语,次朗朗(默认) 翻译菜单、对话框等所有内容 在VisualStudio中重新加载,我可以看到所有资

我从来没有做过这样的事,所以这是我第一次尝试。从网上阅读不同的信息和教程,我可以自信地说,我感到非常困惑,所以我自己去做这件事

我试图实现的是为GUI提供不同语言的不同构建配置

我的应用程序是使用Visual Studio 2019构建的Win32

我尝试了以下步骤:

  • 克隆了我现有的发布版本
  • 在记事本++中打开我的.rc文件并克隆了“默认”语言 部分
  • 更改了克隆节(语言)中的语言宏 朗朗(越南语,次朗朗(默认)
  • 翻译菜单、对话框等所有内容
  • 在VisualStudio中重新加载,我可以看到所有资源的2倍集。( 菜单、对话框、所有内容2套-1套英语和1套越南语)
  • 打开项目宣传->资源并将文化更改为 越南人
  • 成功地完成了这个项目
然而,结果是什么都没有。菜单和对话框仍然是英文的

我还必须做些什么来指定使用哪一组资源来获得不同的语言构建

还是我把这件事搞得太复杂而出了差错


非常感谢任何建议/示例。

我似乎会回答我自己的问题,因为我相信其他人也遇到了这个问题

更改Windows GUI应用程序语言的正确正式方法是:

使用这个函数,以及我在问题中所做的事情;该函数将在运行时应用该语言中的资源。(菜单、对话框、所有内容)

我认为我的情况很简单:

SetThreadUILanguage(MAKELANGID(LANG_VIETNAMESE, SUBLANG_VIETNAMESE_VIETNAM));
然而,在我的例子中,我创建的是每种语言的构建,因此如果您想允许用户在运行时更改语言,请参阅注释和

联合国官方的方法是做更多的工作,但是相当稳定且不容易出错

  • 您必须用该语言翻译和重建菜单
  • 必须按语言翻译和重命名每个对话框ID,并按语言显示该对话框ID
对于社区和其他开发人员,我将分享重建菜单的代码:

// Find our Menu resource based on desired language
HRSRC hRes = FindResourceExW(hInstance, RT_MENU, MAKEINTRESOURCE(IDC_APPLICATION), MAKELANGID(LANG_VIETNAMESE, SUBLANG_VIETNAMESE_VIETNAM));

if (!hRes) {
    wchar_t buf[MAX_PATH] = { 0 };
    FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buf, (sizeof(buf) / sizeof(wchar_t)), NULL);
    MessageBoxW(0, buf, _TEXT(L"FindResourceExW Error"), MB_OK | MB_ICONERROR);
    return FALSE;
}

// Load our Menu resource based on desired language
HGLOBAL hGlo = LoadResource(hInstance, hRes);

if (!hGlo) {
    wchar_t buf[MAX_PATH] = { 0 };
    FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buf, (sizeof(buf) / sizeof(wchar_t)), NULL);
    MessageBoxW(0, buf, _TEXT(L"LoadResource Error"), MB_OK | MB_ICONERROR);
    return FALSE;
}

// Lock the resource
LPVOID pData = LockResource(hGlo);

if (pData == NULL) {
    wchar_t buf[MAX_PATH] = { 0 };
    FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buf, (sizeof(buf) / sizeof(wchar_t)), NULL);
    MessageBoxW(0, buf, _TEXT(L"LockResource Error"), MB_OK | MB_ICONERROR);
    return FALSE;
}

// Load the new Menu into memory
HMENU hMenu = LoadMenuIndirectW((MENUTEMPLATE*)pData);

if (!hMenu) {
    wchar_t buf[MAX_PATH] = { 0 };
    FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buf, (sizeof(buf) / sizeof(wchar_t)), NULL);
    MessageBoxW(0, buf, _TEXT(L"LoadMenuIndirectW Error"), MB_OK | MB_ICONERROR);
    return FALSE;
}

// Get our default Menu
HMENU hMenu_old = GetMenu(g_Hwnd);

// Set no Menu
SetMenu(g_Hwnd, NULL);

// Erase default Menu
DestroyMenu(hMenu_old);

// Set our new Menu
SetMenu(g_Hwnd, hMenu);

// Draw our new Menu
DrawMenuBar(g_Hwnd);
注意:如果您想使用FindResourceEx搜索字符串,因为RT\U字符串更为复杂,因此请在浪费您的时间之前


享受吧

您需要查看从RC文件加载资源的位置,并使用适当的语言ID调用
findresourcexa
@RichardCritten有趣的是,我正在看这个。@RichardCritten这似乎是我需要的,但是我不知道如何正确使用它…@NorbertBoros是一个旧案例。我不确定这对你是否有帮助。