Include在资源文件Visual Studio中不起作用

问题描述 投票:0回答:2

我现在正在学习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时,它可以正常工作,没问题,但它会解决问题。

我怎么能让这个工作?谢谢

c winapi resource-files
2个回答
2
投票

错误RC2108:预期的数值对话常量

这意味着您必须使用合理的数字(可能为0)。 CW_USEDEFAULT(这是(int)0x80000000L)仅对CreateWindow() / CreateWindowEx() WinAPI函数有意义。由于资源编译器既不支持类型转换,也不允许负对话坐标,因此会导致语法错误。

风格WS_OVERLAPPEDWINDOW也不应该与对话框一起使用。考虑使用基于WS_POPUP的样式。


1
投票

当您从资源编译器中包含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消息时,您应该使用真实坐标(以对话框单位表示)或重新定位对话框。

© www.soinside.com 2019 - 2024. All rights reserved.