替换 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_BUTTONTDCBF_NO_BUTTONTDCBF_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 可能不是最好的主意。