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

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

我想创build一个带有一个DialogBox.rs文件,该文件使用一个string作为variables,而不是一个“”,所以我可以在程序中进行更改。

例如:在

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

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

为什么? 我正在尝试创build一个DialogBox,就像一个“模板” ,并使用不同的文本在其中的同一个button中创build许多实例。

希望我的胡言乱语被忽略。

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

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

所以你坚持难以编码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 )。

实际上,您可以使用上述内容来创建一个新的内存中对话框模板,每次您想在按钮上使用不同文本的DialogBox时。 然而,如果你真正想要做的只是改变一些文本,就像Cody所说的那样,你可以用SetDlgItemText

如果你真的好奇,下面是一个例子 。