将定义的常量的名称转换为在 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
的单元格),我想排除程序崩溃。
看起来你的 forceId
和 wisdomId
是 char*
,所以你正在使用这些字符串的地址。
无论如何,您在运行时不会有 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...
等做同样的事情
我有一些定义的常数:
#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
的单元格),我想排除程序崩溃。
看起来你的 forceId
和 wisdomId
是 char*
,所以你正在使用这些字符串的地址。
无论如何,您在运行时不会有 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...
等做同样的事情