c++ - 在 .rs 资源文件 C++ 控制台中使用参数

标签 c++ windows winapi resource-files

有个类似的问题here但我正在寻找 C++ 版本。

我想创建一个 .rs 文件,其中包含一个 DialogBox,它使用 string 作为变量 而不是 "",这样我就可以更改它在程序中。

例如:在

DEFPUSHBUTTON   "Hello World", IDOK, 8, 24, 75, 14

“Hello World” 将成为一个变量名,我可以在程序中“定义”设置

为什么?我正在尝试制作一个对话框,就像一个"template",并在程序周围制作许多实例,其中包含不同的文本但相同的按钮

希望我的胡言乱语得到理解。

最佳答案

不幸的是,这是不可能的。控件的标题文本必须是常量字符串,因为资源文件实际上是与您的应用程序分开编译的,并且不知道程序代码中其他地方定义的变量。

资源文件确实支持字符串表,但即使是这些也需要字符串是常量值。优点是您可以修改资源文件而无需访问源代码的其余部分,这使得本地化之类的事情成为可能,即使是外部翻译人员也是如此。

因此您无法对 DEFPUSHBUTTON 的初始标题进行硬编码。它可以是空字符串或您想要的任何值;你只需要一个占位符。您可以将所有可能的字幕放在一个字符串表中(我推荐这样做),但您不能使用任何自动化机制将两者链接起来。

您需要自己编写代码来执行此操作。您当然可以动态 生成资源,但这相当麻烦。我认为最简单的方法就是创建对话框(使用"template"资源文件),检索要更改其标题文本的控件的句柄,然后向它们发送 WM_SETTEXT带有新字符串的消息。事实上,SetDlgItemText函数将为您完成此操作。

也许用一些代码来解释会更容易。假设您定义了一个对话框资源,包括所有控件。您希望修改的所有控件都需要为每个控件分配一个唯一的 ID,以便您可以在运行时区分它们。您在资源文件中分配的初始 值是什么并不重要,因为您将立即更改它们。它可能看起来像这样:

IDD_TEMPLATE DIALOG DISCARDABLE  0, 0, xx, xx
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION
CAPTION "Dialog Template"
FONT 8, "MS Sans Serif"
BEGIN
    CTEXT           "Placeholder text", IDC_MESSAGE, xx, xx, xx, xx
    DEFPUSHBUTTON   "Placeholder",      IDOK,        xx, xx, xx, xx
    PUSHBUTTON      "Cancel",           IDCANCEL,    xx, xx, xx, xx
END

然后,在您的对话过程 ( DialogProc ) 中,处理 WM_INITDIALOG留言如下:

INT_PTR CALLBACK TemplateDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
  switch (uMsg)
  {
    case WM_INITDIALOG:
    {
      // Load the caption strings you want to use from the string table
      // in the resource file, or get them from wherever you want.
      // These are the "variables" you wanted to use in the question.
      TCHAR* pszMessage;
      LoadString(hInstance,   /* instance handle for app or resource DLL */
                 IDS_MESSAGE, /* ID of the string resource to load       */
                 reinterpret_cast<LPTSTR>(&pszMessage),
                 0);
      TCHAR* pszOkBtn;
      LoadString(hInstance, IDS_OKBUTTON, reinterpret_cast<LPTSTR>(&pszOkBtn), 0);
      // ...etc.

      // Set the caption text for each control.
      SetDlgItemText(hwndDlg,     /* handle to the dialog box window */
                     IDC_MESSAGE, /* ID of the control to modify     */
                     pszMessage); /* variable containing text to set */
      SetDlgItemText(hwndDlg, IDOK, pszOkBtn);
      // ...etc.

      // And, if you want to set some other properties, you can do that too.
      // For example, you might set the caption of the dialog itself.
      TCHAR* pszTitle;
      LoadString(hInstance, IDS_DLGCAPTION, reinterpret_cast<LPTSTR>(&pszTitle), 0);
      SetWindowText(hwndDlg, pszTitle);
      // ...etc.

      return TRUE;  // set the default focus
    }
    // ...process other messages as necessary
  }
  return FALSE;  // we did not process the message
}

关于c++ - 在 .rs 资源文件 C++ 控制台中使用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16156573/

相关文章:

c++ - 如何将输出设置为中间?

java - JSL Windows 服务未启动

java - 如何在 java 中的 Windows 启动时启动我的应用程序

c++ - 通过从 C/C++ 调用 Windows API 函数来生成独立的汇编子例程

c++ - 重载决策中的 const 指针

c++ - 为什么在类对象的声明中写一个 "class"?

C++按值从 vector 中删除元素

windows - 跟踪对 Delphi 中的文件夹所做的更改

c++ - 如何更改非模态对话框的默认 CDialog 字体?

winapi - TreeView 中的 Win32 文本框