我一直在使用Win32的资源脚本。过了一会儿,我制作了一个菜单,并在.h
头文件中将菜单项ID实现为枚举值。在将头文件包含到资源脚本并尝试编译项目之后,我注意到枚举不适用于我的资源编译器,并且被强制#define所有菜单ID。
我收到的错误:
[错误]参数无效
[资源错误]语法错误(资源脚本中第一个枚举值出现的代码行)
[资源错误]预处理失败
我使用Dev-C ++和windres.exe作为资源编译器。
我想知道这对于未经修改的IDE是否正常。是否有一个通用的解决方案,比如在IDE的bin库中添加一个特定的预处理器,或者我是否只编写了我自己的小预处理器? 一般来说,专业人士如何在不手动跟踪资源ID并试图避免“ID冲突”的情况下这样做? 此外,如果C ++编译器以某种方式将#define宏借用到任何其他涉及的编译过程,那么这个问题会不在桌面上吗?
以下是我尝试的相同内容:
资源脚本:(resources.rc)
#include <windows.h>
#include <resource.h>
IDR_MYMENU MENU
{
POPUP "Über..."
{
MENUITEM "Dieses Programm", MENU_UEBER_DIESES_PROGRAMM, GRAYED
}
POPUP "Einstellungen"
{
MENUITEM "Konfiguration", MENU_EINST_KONFIG
MENUITEM "Optionen", MENU_EINST_OPTIONEN, GRAYED
}
POPUP "Daten"
{
MENUITEM "Hersteller", MENU_DATEN_HRST
MENUITEM "Verfahren", MENU_DATEN_VERF, GRAYED
POPUP "Werkzeuge"
{
MENUITEM "Oberwerkzeuge", MENU_DATEN_OW
MENUITEM "Unterwerkzeuge", MENU_DATEN_UW, GRAYED
}
MENUITEM "Werkstoffe", MENU_DATEN_WS, GRAYED
MENUITEM "Messwerte", MENU_DATEN_MW, GRAYED
}
POPUP "Diagnose"
{
MENUITEM "Logdatei", MENU_DIAGNOSE_LOGDATEI
MENUITEM "Letzter Fehlerbericht", MENU_DIAGNOSE_FEHLERBERICHT, GRAYED
}
POPUP "Entwickler"
{
MENUITEM "XML Import", MENU_ENTW_XML_IMP, GRAYED
MENUITEM "Konsole anzeigen", MENU_ENTW_KONSOLE, GRAYED
}
POPUP "?"
{
MENUITEM "Entwickler kontaktieren", MENU_HILFE_ENTW_KONTAKT, GRAYED
MENUITEM "Readme", MENU_HILFE_README, GRAYED
}
}
这是头文件,就像我预期的那样简单(resource.h):
#ifndef RESOURCE_H_
#define RESOURCE_H_
// Menu
enum {
IDR_MYMENU = 200,
MENU_UEBER_DIESES_PROGRAMM,
MENU_EINST_KONFIG,
MENU_EINST_OPTIONEN,
MENU_DATEN_HRST,
MENU_DATEN_VERF,
MENU_DATEN_OW,
MENU_DATEN_UW,
MENU_DATEN_WS,
MENU_DATEN_MW,
MENU_DIAGNOSE_LOGDATEI,
MENU_DIAGNOSE_FEHLERBERICHT,
MENU_ENTW_XML_IMP,
MENU_ENTW_KONSOLE,
MENU_HILFE_ENTW_KONTAKT,
MENU_HILFE_README
}
#endif // RESOURCE_H_
这是一个不方便的头文件,因为我一直在修复它:(resource.h)
#ifndef RESOURCE_H_
#define RESOURCE_H_
// Menu
#define IDR_MYMENU 200
// START Menu items
#define MENU_UEBER_DIESES_PROGRAMM 11
#define MENU_EINST_KONFIG 21
#define MENU_EINST_OPTIONEN 22
#define MENU_DATEN_HRST 31
#define MENU_DATEN_VERF 32
#define MENU_DATEN_OW 33
#define MENU_DATEN_UW 34
#define MENU_DATEN_WS 35
#define MENU_DATEN_MW 36
#define MENU_DIAGNOSE_LOGDATEI 41
#define MENU_DIAGNOSE_FEHLERBERICHT 42
#define MENU_ENTW_XML_IMP 51
#define MENU_ENTW_KONSOLE 52
#define MENU_HILFE_ENTW_KONTAKT 61
#define MENU_HILFE_README 62
// END Menu items
#endif // RESOURCE_H_
答案 0 :(得分:2)
资源编译器对C或C ++一无所知。在资源编译器使用结果之前,脚本只是通过C预处理器(我认为已经定义了RC_INVOKED
)。资源脚本语言,例如对于字符串文字,与C语言非常不同。
因此,要定义可在资源脚本和C或C ++编译器中使用的常量,请使用#define
。
对于C或C ++方面(仅限),您可以使用宏符号指定的值定义枚举,但我认为没有太大的优势。至少我想不出任何一个。