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

Use A Parameter In A .rs Resource File C++ Console

本文关键字:参数 控制台 c++ rs 资源 源文件      更新时间:2023-10-16

这里有一个类似的问题,但我正在寻找一个 c++ 版本。

我想创建一个。rs文件,带有对话框,该对话框使用字符串作为变量而不是" ",因此我可以在程序中更改它。

例如:在

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

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

为什么?我正试图使一个对话框,像一个'模板',并使许多实例周围的程序与不同的文本,但相同的按钮在他们。

希望你能理解我的胡言乱语。

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

资源文件确实支持字符串表,但即使这样也要求字符串为常数值。这样做的好处是,您可以修改资源文件而无需访问源代码的其余部分,这使得本地化之类的事情成为可能,甚至可以由外部翻译人员进行本地化。

所以你被硬编码你的DEFPUSHBUTTON的初始标题。它可以是一个空字符串或任何你想要的值;你只需要一个占位符。您可以将所有可能的标题放在字符串表中(我建议这样做),但您不能使用任何自动机制将两者连接起来。

您需要自己编写代码来完成此操作。您当然可以动态地生成资源,但这相当麻烦。我认为这样做的最简单的方法是创建对话框(使用你的"模板"资源文件),检索控件的句柄,其标题文本你想改变,并发送他们一个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
}

虽然我认为Cody Gray的答案更好,但总是有在内存中创建对话框模板的选项,并在创建对话框的新实例时修改它。我不会推荐它,除非你觉得这种事情很有趣(我是其中之一)。我当然不会推荐你这么做,但从技术上讲,这是一个选择…

DialogBoxIndirect接受一个指向结构体的指针,该结构体由描述对话框本身的标题(DLGTEMPLATE)和指定数量的控件(DLGITEMTEMPLATE)组成。

有效地,你可以使用上面的构建一个新的内存对话框模板,每次你想在按钮上有不同的文本对话框。然而,如果你真正想做的是改变一些文本,这就有点极端了,正如Cody所说,你可以用SetDlgItemText来做。

如果你真的对很好奇,这里有一个例子。