包含在资源文件中不起作用 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 消息时,您应该使用真实坐标(以对话框单位表示)或重新定位对话框。