C++ MFC,使用 ID 变量获取 GUI 控件
C++ MFC, Get GUI Control using a ID variable
我想知道是否有可能获得一个以变量作为其 ID 的 MFC GUI 控件。我有几个控件我想立即更改,即 IDC_btn30、IDC_btn29 等,因此如果可能的话,这将提高代码效率。
int days = 31;
std::string id = "IDC_btn" + days;
GetDlgItem(id)->EnableWindow(FALSE);
我这样做的方法是创建一个 header 文件,该文件将一系列控件 ID 固定映射到递增的整数序列:
#define IDC_BUTTON1 2001
#define IDC_BUTTON2 2002
#define IDC_BUTTON3 2003
#define IDC_BUTTON4 2004
等等
然后需要将 .rc 文件设置为包含 header。在 Visual Studio 中,这是通过将其添加到 TEXTINCLUDE 2 资源来完成的。在 AppWizard 生成的文件中,内容如下:
2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""\r\n"
"[=11=]"
EN
添加您的 header 使其显示为:
2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""\r\n"
"#include ""myres.h""\r\n"
"[=12=]"
EN
这个条目也可以通过 Visual Studio IDE 添加,方法是切换到项目中的资源视图 window,right-clicking 在适当的 .rc 文件上和选择“资源包括...”。然后 #include "myres.h"
应该添加到“Read-only 符号指令”部分。其他资源编辑器可能有自己的技术来执行此操作。
还有 #include
实现文件中的 header 文件 window class。
然后您将能够计算该范围内的控件 ID,例如在如下循环中:
for (int n = 0; n < 4; n++)
{
GetDlgItem(IDC_BUTTON1 + n)->ShowWindow(SW_SHOW);
}
另一种不太优雅但更 self-contained 的技术是在您的实现文件中创建一个控件 ID 数组并对其进行循环:
static const int Controls[] =
{
IDC_FRAME1, IDC_RADIO1, IDC_RADIO2, IDC_BUTTON1, IDC_BUTTON2
};
...
for (int n = 0; n < _countof(Controls); n++)
{
GetDlgItem(Controls[n])->ShowWindow(SW_SHOW);
}
我想知道是否有可能获得一个以变量作为其 ID 的 MFC GUI 控件。我有几个控件我想立即更改,即 IDC_btn30、IDC_btn29 等,因此如果可能的话,这将提高代码效率。
int days = 31;
std::string id = "IDC_btn" + days;
GetDlgItem(id)->EnableWindow(FALSE);
我这样做的方法是创建一个 header 文件,该文件将一系列控件 ID 固定映射到递增的整数序列:
#define IDC_BUTTON1 2001
#define IDC_BUTTON2 2002
#define IDC_BUTTON3 2003
#define IDC_BUTTON4 2004
等等
然后需要将 .rc 文件设置为包含 header。在 Visual Studio 中,这是通过将其添加到 TEXTINCLUDE 2 资源来完成的。在 AppWizard 生成的文件中,内容如下:
2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""\r\n"
"[=11=]"
EN
添加您的 header 使其显示为:
2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""\r\n"
"#include ""myres.h""\r\n"
"[=12=]"
EN
这个条目也可以通过 Visual Studio IDE 添加,方法是切换到项目中的资源视图 window,right-clicking 在适当的 .rc 文件上和选择“资源包括...”。然后 #include "myres.h"
应该添加到“Read-only 符号指令”部分。其他资源编辑器可能有自己的技术来执行此操作。
还有 #include
实现文件中的 header 文件 window class。
然后您将能够计算该范围内的控件 ID,例如在如下循环中:
for (int n = 0; n < 4; n++)
{
GetDlgItem(IDC_BUTTON1 + n)->ShowWindow(SW_SHOW);
}
另一种不太优雅但更 self-contained 的技术是在您的实现文件中创建一个控件 ID 数组并对其进行循环:
static const int Controls[] =
{
IDC_FRAME1, IDC_RADIO1, IDC_RADIO2, IDC_BUTTON1, IDC_BUTTON2
};
...
for (int n = 0; n < _countof(Controls); n++)
{
GetDlgItem(Controls[n])->ShowWindow(SW_SHOW);
}