3

MyWinApp::InitInstance()假设您有一个基于对话框的 MFC 应用程序,它通过调用从函数中显示它的主对话框dlg.DoModal()

此外,此应用程序包含本地化资源(全部在项目中,此测试用例没有附属 DLL),也就是说,该IDD_TEST_DIALOG资源有两次,一次是英语,一次是德语。

我现在要做的是在此对话框中添加一个按钮,用于在资源中的可用语言之间切换显示对话框的语言。这可能吗?(记住:对话框当前是通过DoModal()函数显示的。)

当您想更改 MFC 使用的资源语言时,您调用SetThreadUILanguage(适用于 WIn7 和 XP)或者SetThreadPreferredUILanguages如果仅针对 Win7(Vista+)也可以调用。真的,如果您能够重新打开对话框,那么更改语言非常容易。对我来说,问题是是否有可能以某种方式重新加载具有不同资源的显示窗口。


请注意,可以确保重新加载所有字符串,也就是说,以某种方式遍历应用程序中的所有控件并调用SetWindowText以更改窗口的文本。

然而,这与本地化对话框(资源)应该提供的内容背道而驰,即不仅翻译的字符串,而且对话框布局的必要更改:不同的语言字符串可能具有不同的长度,因此控件必须间隔不同。(我也可以想象,当支持从右到左的语言或亚洲文字时,必须相应地采用布局。)

4

1 回答 1

2

最简单的事情可能不是使用另一个对话框模板,而是通过使用将对话框的每个控件 ID 映射到字符串资源的表,以编程方式逐个更改对话框控件的文本。

对您来说更好的解决方案是解析其他语言的对话框模板,并用模板中找到的文本替换显示对话框中每个控件的文本,并根据模板对话框中的大小和位置调整控件的大小和位置。

不幸的是,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 回答