2017-01-12 25 views
1

私はWindows APIを使用してC言語で多言語Win32プログラムを開発しています。これにより、ユーザーはインターフェースの言語を選択できます。 MSDN documentationに従って、私はFindResourceEx() + LoadResource()ではなく、で信頼性の低いSetThreadLocale()を使用する必要があります。`FindResourceEx()`と `LoadResource()`を使って新しいメニューを読み込む方法は?

私の問題は次のとおりです。リソースからメニューをロードする方法がわかりません。

以下のサンプルコードを考慮して、メニューを読み込んで更新するにはどのように変更する必要がありますか?

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); 
+1

:それ自身のリソースDLL内の各言語。次に、実行時に、目的のユーザー言語に一致するリソースDLLをロードするだけです。そのような特別な処理をすることなく直接 'LoadMenu'を呼び出すことができます。画像やアイコンなどのローカライズされていないリソースは、EXEにそのまま残ります。あなたはそれらの行に沿った解決策に興味がありますか? – selbie

+0

@selbieはい、私は午前です。特にランタイム中にいつでも言語を変更できるようにしている場合は特にそうです。 – user7023624

答えて

3

代替ソリューションは、コマンドで提案されている(別の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); 
+0

あなたのコードの小さな間違い(2017-01-13):['FindResource()']を使う(https://msdn.microsoft.com/en-us/library/windows/desktop/ms648042%28v=vs.85) %29.aspx)の代わりに 'FindResourceEx()'を使用します。 **質問:**新しいサンプルコードを読み込む前に、サンプルコードのように前のメニューを破棄する必要はありませんか? – user7023624

+1

@ user7023624 * SetMenu関数は、前のメニューを置き換えますが、それを破棄しません。アプリケーションはDestroyMenu関数を呼び出してこのタスクを実行する必要があります* –

関連する問題