我现在正在学习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时,它可以正常工作,没问题,但它会解决问题。
我怎么能让这个工作?谢谢
错误RC2108:预期的数值对话常量
这意味着您必须使用合理的数字(可能为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
消息时,您应该使用真实坐标(以对话框单位表示)或重新定位对话框。