替换 Windows 任务对话框中的文本“确定”、“取消”、“是”、“否”
Replacing texts “OK”, “Cancel”, “Yes”, “No” in Windows Task Dialogs
在 Win32 Task Dialog 上,标准按钮的文本 "OK"、"Cancel"、"Yes"、"No" 等会自动显示在系统的语。如果软件的语言与系统的语言不同,这可能是个问题。
例如,如果客户在英文 Windows 上安装我们软件的法文版本,任务对话框的内容将为法文,但任务对话框底部的标准按钮将为英文不管怎样
有谁知道我该如何更改这些文本。
这个问题类似于 this SO question,后者处理 属性 张纸。
更新:
我尝试从 CTaskDialog
派生 class 并重写 OnInit()
方法以获取 CTaskDialog 的 m_hWnd
并采用与上述问题类似的方法事先,但不幸的是 CTaskDialog::m_hWnd
是私有的:
class CMyTaskDialog : public CTaskDialog
{
public:
CMyTaskDialog(_In_ const CString& strContent, _In_ const CString& strMainInstruction, _In_ const CString& strTitle,
_In_ int nCommonButtons = TDCBF_OK_BUTTON | TDCBF_CANCEL_BUTTON, _In_ int nTaskDialogOptions = TDF_ENABLE_HYPERLINKS | TDF_USE_COMMAND_LINKS,
_In_ const CString& strFooter = CString());
virtual HRESULT OnCreate();
};
CMyTaskDialog::CMyTaskDialog(_In_ const CString& strContent, _In_ const CString& strMainInstruction, _In_ const CString& strTitle,
_In_ int nCommonButtons, _In_ int nTaskDialogOptions,
_In_ const CString& strFooter) :
CTaskDialog(strContent, strMainInstruction, strTitle,nCommonButtons, nTaskDialogOptions, strFooter)
{
}
HRESULT CMyTaskDialog::OnCreate()
{
// tried to do stuff with m_hWnd, but m_hWnd is private :-(
return __super::OnCreate();
}
然而,这是一个非常糟糕的想法,可以按照我下面的回答所示正确地完成。
其实很简单:
而不是使用标准按钮 TDCBF_YES_BUTTON
、TDCBF_NO_BUTTON
、TDCBF_CANCEL_BUTTON
等,您需要使用非这些按钮,但添加您自己的按钮 AddCommandControl
,并在 nTaskDialogOptions
参数中创建带有 0 的 CTaskDialog
对象,从而禁用 TDF_USE_COMMAND_LINKS
模式。那么这些按钮将不会显示为命令链接,而是显示为简单按钮。
最小示例:
CTaskDialog taskDialog(L"", L"Voulez-vous enregistrer les modifications?",
L"Some title", 0, 0);
taskDialog.AddCommandControl(100, L"Oui");
taskDialog.AddCommandControl(102, L"Non");
taskDialog.SetDefaultCommandControl(100);
INT_PTR x = taskDialog.DoModal();
...
但是有一个问题:您不能在同一个任务对话框中有按钮 和 命令链接。但这个问题是一个小问题(至少对我而言),因为在同一个任务对话框中具有命令链接 和 按钮的 IMO 可能不是最好的主意。
在 Win32 Task Dialog 上,标准按钮的文本 "OK"、"Cancel"、"Yes"、"No" 等会自动显示在系统的语。如果软件的语言与系统的语言不同,这可能是个问题。
例如,如果客户在英文 Windows 上安装我们软件的法文版本,任务对话框的内容将为法文,但任务对话框底部的标准按钮将为英文不管怎样
有谁知道我该如何更改这些文本。
这个问题类似于 this SO question,后者处理 属性 张纸。
更新:
我尝试从 CTaskDialog
派生 class 并重写 OnInit()
方法以获取 CTaskDialog 的 m_hWnd
并采用与上述问题类似的方法事先,但不幸的是 CTaskDialog::m_hWnd
是私有的:
class CMyTaskDialog : public CTaskDialog
{
public:
CMyTaskDialog(_In_ const CString& strContent, _In_ const CString& strMainInstruction, _In_ const CString& strTitle,
_In_ int nCommonButtons = TDCBF_OK_BUTTON | TDCBF_CANCEL_BUTTON, _In_ int nTaskDialogOptions = TDF_ENABLE_HYPERLINKS | TDF_USE_COMMAND_LINKS,
_In_ const CString& strFooter = CString());
virtual HRESULT OnCreate();
};
CMyTaskDialog::CMyTaskDialog(_In_ const CString& strContent, _In_ const CString& strMainInstruction, _In_ const CString& strTitle,
_In_ int nCommonButtons, _In_ int nTaskDialogOptions,
_In_ const CString& strFooter) :
CTaskDialog(strContent, strMainInstruction, strTitle,nCommonButtons, nTaskDialogOptions, strFooter)
{
}
HRESULT CMyTaskDialog::OnCreate()
{
// tried to do stuff with m_hWnd, but m_hWnd is private :-(
return __super::OnCreate();
}
然而,这是一个非常糟糕的想法,可以按照我下面的回答所示正确地完成。
其实很简单:
而不是使用标准按钮 TDCBF_YES_BUTTON
、TDCBF_NO_BUTTON
、TDCBF_CANCEL_BUTTON
等,您需要使用非这些按钮,但添加您自己的按钮 AddCommandControl
,并在 nTaskDialogOptions
参数中创建带有 0 的 CTaskDialog
对象,从而禁用 TDF_USE_COMMAND_LINKS
模式。那么这些按钮将不会显示为命令链接,而是显示为简单按钮。
最小示例:
CTaskDialog taskDialog(L"", L"Voulez-vous enregistrer les modifications?",
L"Some title", 0, 0);
taskDialog.AddCommandControl(100, L"Oui");
taskDialog.AddCommandControl(102, L"Non");
taskDialog.SetDefaultCommandControl(100);
INT_PTR x = taskDialog.DoModal();
...
但是有一个问题:您不能在同一个任务对话框中有按钮 和 命令链接。但这个问题是一个小问题(至少对我而言),因为在同一个任务对话框中具有命令链接 和 按钮的 IMO 可能不是最好的主意。