将定义的常量的名称转换为在 C 中与之关联的 int

Convert defined constant's name to int which is associated with it in C

我有一些定义的常数:

#define IDD_MAINDIALOG                  101
#define IDC_EXIT                        1001
#define IDC_START                       1002
#define IDC_STOP                        1003
#define IDC_STATE1                      1004
#define IDC_STATE2                      1005
#define IDC_STATE3                      1006
#define IDC_STATE4                      1007
#define IDC_STATE5                      1008
#define IDC_FORCE1                      1009
#define IDC_FORCE2                      1010
....

表示我程序中Static Text对应的单元格

而且我需要不断更改这些单元格中的值。我想用 SetDlgItemText 做。但它需要更改控件的 int 值作为第二个参数。我试着这样做:

sprintf(forceId, "IDC_FORCE%d", philNum + 1);
sprintf(wisdomId, "IDC_WISDOM%d", philNum + 1);
...
SetDlgItemText(hWnd, (int)forceId, force);
SetDlgItemText(hWnd, (int)wisdomId, wisdom);

但是程序什么都不显示,在跟踪时我发现我的 (int)forceId(int)wisdomId 值大约为 11793000 而不是 1007 或其他值。

那么,将定义的常量名称转换为与之关联的 int 值的正确方法是什么?

我不想使用确切的控件名称以避免复制代码,因为我有很多单元格,而且我也知道在这种情况下可以使用数字 1001、1002...在一个循环中,但如果要进行一些更改(比如删除 ID 为 IDC_STATE3 的单元格),我想排除程序崩溃。

看起来你的 forceIdwisdomIdchar*,所以你正在使用这些字符串的地址。

无论如何,您在运行时不会有 IDC_STATE1 值,它将是 1004

这样的事情,我会手动把ID排好顺序,按照第一个ID计算:

SetDlgItemText(hWnd, IDC_FORCE1 + philNum, force);

您的常量名称在运行时不存在,它们只对预处理器有意义。在运行时,只有它们的编号会存在。您的代码在任何地方使用 IDC_FORCE1 等,它们将在编译过程中被替换为实际数字。

SetDlgItemText() 将父控件 window 和子控件 ID 作为输入。您正在尝试传入格式化字符串作为控件 ID。这是行不通的。只需按原样传递实际控件 ID 号,例如:

#define IDC_FORCE_BASE                  1009
#define IDC_FORCE1                      IDC_FORCE_BASE+0
#define IDC_FORCE2                      IDC_FORCE_BASE+1

...

SetDlgItemText(hWnd, IDC_FORCE_BASE + philNum, force);

IDC_STATE...IDC_WISDOM...等做同样的事情