gpt4 book ai didi

winapi - 是否可以动态更改模态对话框的语言?

转载 作者:行者123 更新时间:2023-12-02 02:03:09 25 4
gpt4 key购买 nike

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

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

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

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


请注意,可以确保重新加载所有字符串,即 somehow遍历应用程序中的所有控件并调用 SetWindowText 来更改窗口的文本。

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

最佳答案

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

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

不幸的是,Windows 中没有用于解析对话框模板的 API,但有一个漂亮的 good blog entry by 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
}

关于winapi - 是否可以动态更改模态对话框的语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16232200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com