3

MyWinApp::InitInstance()を呼び出して関数からメイン ダイアログを表示するダイアログ ベースの MFC アプリケーションがあるとしますdlg.DoModal()

さらに、このアプリケーションにはローカライズされたリソースが含まれています (すべてプロジェクト内にあり、このテスト ケースのサテライト DLL はありません)。つまり、IDD_TEST_DIALOGリソースは英語で 1 回、ドイツ語で 1 回の 2 回あります。

ここでやりたいことは、このダイアログにボタンを追加して、表示されるダイアログの言語をリソースで使用可能な言語間で切り替えることです。これは可能ですか?(覚えておいてください: ダイアログは現在、DoModal()関数を介して表示されます。)

MFC で使用されるリソース言語を変更する場合は、呼び出すSetThreadUILanguage(WIn7 および XP で動作する) か、SetThreadPreferredUILanguagesWin7 (Vista+) のみを対象とする場合に呼び出すこともできます。実際、ダイアログを再度開くことができれば、言語の変更は非常に簡単です。私にとっての問題は、表示されたウィンドウをさまざまなリソースで何らかの方法でリロードできるかどうかです。


すべての文字列がリロードされることを確認するだけでよいことに注意してください。つまり、何らかの方法アプリケーション内のすべてのコントロールをウォークスルーしSetWindowText、ウィンドウのテキストを変更するために呼び出します。

ただし、これは、ローカライズされたダイアログ (リソース) が提供するはずのもの、つまり、翻訳された文字列だけでなく、ダイアログ レイアウトに必要な変更にも反するものです。異なる言語の文字列はおそらく異なる長さになるため、コントロールの間隔を空ける必要があります。違う。(右から左に記述する言語やアイシアン文字をサポートする場合、それに応じてレイアウトを採用する必要があることも想像できます。)

4

1 に答える 1

2

最も簡単な方法は、おそらく別のダイアログ テンプレートを使用せず、ダイアログの各コントロール ID を文字列リソースにマップするテーブルを使用して、ダイアログ コントロールのテキストをプログラムで 1 つずつ変更することです。

より良い解決策は、他の言語のダイアログ テンプレートを解析し、表示されたダイアログの各コントロールのテキストをテンプレートで見つかったテキストに置き換え、テンプレート ダイアログのサイズと位置に従ってコントロールのサイズと位置を変更することです。

残念ながら、Windows にはダイアログ テンプレートを解析するための API はありませんが、ダイアログ テンプレートを扱っているRaymond Chen による非常に優れたブログ エントリがあります。

擬似コード:

foreach (control in the other language's dialog template)
{
  string = control.GetText() ;            // Get text from dialog template's control
  CRect rect = control.GetRect() ;        // Get rectangle from dialog template's control

  CWnd *pCtrl = GetDlgItem(control.id) ;  // Get pointer to control in dialog
  pCtrl->SetWindowText(control) ;         // Set new text of control
  pCtrl->MoveWindow(rect) ;               // resize and reposition control      
}
于 2013-04-26T09:50:54.207 に答える