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);
}