c++ - 替换 Windows 任务对话框中的文本 “OK” 、 “Cancel” 、 “Yes” 、 “No”

标签 c++ windows winapi mfc taskdialog

在 Win32 上 Task Dialog标准按钮的文本“确定”、“取消”、"is"、“否”等会自动以系统语言显示。如果软件的语言与系统的语言不同,这可能会成为问题。

例如,如果客户在英语 Windows 上安装我们软件的法语版本,则任务对话框的内容将为法语,但任务对话框底部的标准按钮无论如何都将为英语。

有谁知道我如何更改这些文本。

这个问题类似于this SO question它正在处理属性表。

更新:

我尝试从 CTaskDialog 派生一个类并重写 OnInit() 方法,以获取 CTaskDialog 的 m_hWnd 并采用类似的方法比前面提到的问题要多,但不幸的是 CTaskDialog::m_hWnd 是私有(private)的:

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();
  ...

enter image description here

但是有一个问题:同一个任务对话框中不能有按钮命令链接。但这个问题是一个小问题(至少对我来说),因为 IMO 在同一任务对话框中拥有命令链接和按钮可能不是最好的主意。

关于c++ - 替换 Windows 任务对话框中的文本 “OK” 、 “Cancel” 、 “Yes” 、 “No”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50150814/

相关文章:

java - 在 Java 上运行网络蜘蛛

c# - 从封闭源代码的第三方 Win32 应用程序中的窗口捕获数据

windows - WM_PAINT 和 DX12

带有 const 参数的 C++ 构造函数

c++ - GCC avx2intrin.h(版本 X-9.2)中缺少 _mm_broadcastsd_pd

c++ - 无法在 Windows 下将信号添加到 boost::asio::signal_set

c++ - MFC对话框列表控件的工具提示

c++指向动态矩阵中行的指针

c++ - Objective-C++ 调用 Objective-C

c# - 通过 .NET 连接到 Active Directory