在.rs资源文件c++控制台中使用参数
Use A Parameter In A .rs Resource File C++ Console
这里有一个类似的问题,但我正在寻找一个 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
来做。
如果你真的对很好奇,这里有一个例子。
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 什么是仅调用一次并调用参数的控制台应用
- 执行带有参数的 .bat 文件并以 C++ 格式读取控制台输出
- 如何获得无符号的int作为控制台参数
- 从控制台应用中的命令行参数获取文件名C++
- 如何在C++中调用具有参数和用户控制台输入的函数
- 如何从 Windows 控制台检查程序启动参数
- 将Unicode命令行参数传递到控制台应用程序
- 如何从用户(即控制台)提供数组元素,以及如何将数组元素作为参数传递给函数
- 通过参数写入文件或控制台
- 确保Windows c++控制台应用程序的单实例和参数传递的正确方法
- 正在win32控制台应用程序中打印参数
- 如何使我的EXE可以在控制台接受参数