包含在资源文件中不起作用 Visual Studio
Include doesn't work in a resource file Visual Studio
我现在正在学习 WinAPI...3 天?我已经面临一个问题。
实际上,为了创建一个 DialogBox,我们需要将其模板写入资源文件(例如 resource.rc)。
这是我的 resource.rc:
#include "IDs.h"
#include <windows.h>
DIALOG_HELP DIALOG
CW_USEDEFAULT, CW_USEDEFAULT, 200, 120
STYLE WS_OVERLAPPEDWINDOW
CAPTION "Title"
BEGIN
DEFPUSHBUTTON "Ok", IDOK, 96, 90, 42, 12
ICON icone1, -1, 60, 55, 32, 32
LTEXT "Test DialogBox", -1, 100, 58, 100, 10
END
问题是 #include 似乎没有正常工作。
我在编译的时候得到了resource.rc(6): error RC2108: expected numerical dialog constant
,好像没有包含windows.h而且编译器不知道CW_USEDEFAULT是什么。当我用一个简单的#define CW_USEDEFAULT 1 自己定义 CW_USEDEFAULT 时,它可以工作,没问题,但它会解决问题。
我怎样才能让它工作?谢谢
error RC2108: expected numerical dialog constant
这意味着您必须使用一个合理的数字(可能是 0)。 CW_USEDEFAULT
(即 (int)0x80000000L
)仅对 CreateWindow() / CreateWindowEx()
WinAPI 函数有意义。由于资源编译器既不支持类型转换,也不允许负对话框坐标,因此导致语法错误。
此外,样式 WS_OVERLAPPEDWINDOW
不应与对话框一起使用。考虑改用基于 WS_POPUP
的样式。
当您从资源编译器中包含 windows.h
时,条件编译会对其进行特殊处理,因为资源编译器无法解析 C/C++ 语言的更多高级功能。
windows.h
片段:
#if defined(RC_INVOKED) && !defined(NOWINRES)
#include <winresrc.h>
#else
#if defined(RC_INVOKED)
/* Turn off a bunch of stuff to ensure that RC files compile OK. */
#define NOATOM
#define NOGDI
...
#endif
...
#endif
CW_USEDEFAULT
定义为:
#define CW_USEDEFAULT ((int)0x80000000)
但它被跳过了。当您将此定义直接放在资源脚本中时,无法编译它,因为资源编译器不处理转换。
你可以定义
#define CW_USEDEFAULT 0x80000000
但是对话框模板中的坐标字段被限制为 16 位(short
类型),因此 0x80000000
不适合并且它会在资源数据中被截断为 0(没有任何错误来自资源编译器)。在处理 WM_INITDIALOG
消息时,您应该使用真实坐标(以对话框单位表示)或重新定位对话框。
我现在正在学习 WinAPI...3 天?我已经面临一个问题。 实际上,为了创建一个 DialogBox,我们需要将其模板写入资源文件(例如 resource.rc)。
这是我的 resource.rc:
#include "IDs.h"
#include <windows.h>
DIALOG_HELP DIALOG
CW_USEDEFAULT, CW_USEDEFAULT, 200, 120
STYLE WS_OVERLAPPEDWINDOW
CAPTION "Title"
BEGIN
DEFPUSHBUTTON "Ok", IDOK, 96, 90, 42, 12
ICON icone1, -1, 60, 55, 32, 32
LTEXT "Test DialogBox", -1, 100, 58, 100, 10
END
问题是 #include 似乎没有正常工作。
我在编译的时候得到了resource.rc(6): error RC2108: expected numerical dialog constant
,好像没有包含windows.h而且编译器不知道CW_USEDEFAULT是什么。当我用一个简单的#define CW_USEDEFAULT 1 自己定义 CW_USEDEFAULT 时,它可以工作,没问题,但它会解决问题。
我怎样才能让它工作?谢谢
error RC2108: expected numerical dialog constant
这意味着您必须使用一个合理的数字(可能是 0)。 CW_USEDEFAULT
(即 (int)0x80000000L
)仅对 CreateWindow() / CreateWindowEx()
WinAPI 函数有意义。由于资源编译器既不支持类型转换,也不允许负对话框坐标,因此导致语法错误。
此外,样式 WS_OVERLAPPEDWINDOW
不应与对话框一起使用。考虑改用基于 WS_POPUP
的样式。
当您从资源编译器中包含 windows.h
时,条件编译会对其进行特殊处理,因为资源编译器无法解析 C/C++ 语言的更多高级功能。
windows.h
片段:
#if defined(RC_INVOKED) && !defined(NOWINRES)
#include <winresrc.h>
#else
#if defined(RC_INVOKED)
/* Turn off a bunch of stuff to ensure that RC files compile OK. */
#define NOATOM
#define NOGDI
...
#endif
...
#endif
CW_USEDEFAULT
定义为:
#define CW_USEDEFAULT ((int)0x80000000)
但它被跳过了。当您将此定义直接放在资源脚本中时,无法编译它,因为资源编译器不处理转换。
你可以定义
#define CW_USEDEFAULT 0x80000000
但是对话框模板中的坐标字段被限制为 16 位(short
类型),因此 0x80000000
不适合并且它会在资源数据中被截断为 0(没有任何错误来自资源编译器)。在处理 WM_INITDIALOG
消息时,您应该使用真实坐标(以对话框单位表示)或重新定位对话框。