如何在MFC.rc文件的菜单中使用预处理器指令?
我希望能够根据运行应用程序的版本动态更改资源文件中的代码。例如,我有一个关于菜单。我希望about菜单项根据预处理器指令有不同的描述。我的问题是我能够添加代码。但是当我编辑并保存资源文件时,.aps文件会覆盖我的预处理器指令。我怎样才能避开这件事?下面的代码是我希望在资源脚本中包含的示例如何在MFC.rc文件的菜单中使用预处理器指令?,mfc,Mfc,我希望能够根据运行应用程序的版本动态更改资源文件中的代码。例如,我有一个关于菜单。我希望about菜单项根据预处理器指令有不同的描述。我的问题是我能够添加代码。但是当我编辑并保存资源文件时,.aps文件会覆盖我的预处理器指令。我怎样才能避开这件事?下面的代码是我希望在资源脚本中包含的示例 IDR_EXAMPLE_MENU MENU BEGIN /* Other Menu items */ POPUP "&Help" BEGIN MENUITEM "&Help T
IDR_EXAMPLE_MENU MENU
BEGIN
/*
Other Menu items
*/
POPUP "&Help"
BEGIN
MENUITEM "&Help Topics", ID_HELP_FINDER
MENUITEM SEPARATOR
#ifdef TEST_APP
MENUITEM "&About TEST...", ID_APP_ABOUT
#else
MENUITEM "&About RELEASE...", ID_APP_ABOUT
#endif
END
END
如果我正在运行测试版本,我希望它在菜单项中显示“关于测试”,如果它是发布版本,我希望它显示“关于发布”
在保存.rc文件时,如何将这样的代码添加到资源文件中,而不让.aps文件覆盖预处理器指令
编辑:您可以将代码放在单独的rc文件中,并使用“设置包含”对话框的字段包含它们。看 如果资源不经常更改,则可以将其移动到资源编辑器未修改的.rc2文件中。您可以自由使用前置处理器 另一个选项是创建多个.rc文件(例如,复制原始.rc文件并删除其余文件),并有条件地将其包含在“资源包含..>编译时指令”部分中,资源编辑器将该部分存储在.rc文件中,并按原样在.rc文件末尾重复 例如: 创建两个.rc文件,如 ResourcesDebug.rc:
....
POPUP "&Help"
BEGIN
MENUITEM "&Help Topics", ID_HELP_FINDER
MENUITEM SEPARATOR
MENUITEM "&About TEST...", ID_APP_ABOUT
END
END
....
ResourcesRelease.rc:
....
POPUP "&Help"
BEGIN
MENUITEM "&Help Topics", ID_HELP_FINDER
MENUITEM SEPARATOR
MENUITEM "&About RELEASE...", ID_APP_ABOUT
END
END
....
您可以将其添加到回购协议中,但无需将其添加到项目中。但如果将它们添加到项目中,则必须将它们从编译中排除
编译时指令(资源视图>右键单击.rc):
更多链接:
一种可能是让您使用资源编辑器在VS中编辑文件,然后编写一个后处理程序,该程序可以理解.RC的一般内容,并重新生成“所需的”.RC,用编译器指令替换原始内容。这是可以做到的,但取舍非常具体到您的应用程序。也可以在资源文件中两次使用一个资源,如e菜单 每个资源的属性中都可以有一个条件。您可以在资源中两次使用相同名称的资源 您可以将条件_DEBUG添加到第一个资源。只需复制它并释放条件即可。将其重命名回相同的Id
但假设我必须对新资源文件进行编辑,保存时会覆盖它,删除预处理器指令。如果保存时未被覆盖,则可以将预处理器指令放在同一个.rc文件中。也许我不完全理解你的解决方案。你能详细说明一下吗?这很有效。最后,我把我不想更改的所有内容都放进了一个.rc2文件。它可以工作,但维护起来并不容易。整个VisualStudio资源编辑器只是一段滑稽的代码@xMRi解决方案听起来很有趣,但从未尝试过。另一种方法是使用两种不同(但类似)的菜单资源,一种称为IDR_EXAMPLE_TEST_menu,另一种称为IDR_EXAMPLE_RELEASE_menu,然后在源代码中,使用编译器指令使用IDR\u EXAMPLE\u TEST\u菜单异或IDR\u EXAMPLE\u RELEASE\u菜单您可以有两个不同的命令
MENUITEM“&About TEST…”、ID\u APP\u ABOUTTEST
和MENUITEM”&About RELEASE…”,永久ID_APP_ABOUTMENU
,并在相应的OnUpdate
处理程序中动态删除其中一个。这很简单。让我知道这是否是一个选项,我会写一个更完整的答案。通过这种方式,您可以完全避免使用预处理器命令,如果您使用VS资源编辑器,这可能是一种可能的解决方案。大多数代码库都使用预处理器,所以我可能会这样做,因为其他地方都是这样做的。如果你想写一个完整的答案,我很好奇。我刚刚看到你接受了a.a的解决方案。请让我知道,如果你仍然有兴趣的回答,我在我之前的评论中建议。看起来不错。这里是一篇关于haw it实际工作的MSDN论坛帖子-
#define _AFX_NO_SPLITTER_RESOURCES
#define _AFX_NO_OLE_RESOURCES
#define _AFX_NO_TRACKER_RESOURCES
#define _AFX_NO_PROPERTY_RESOURCES
#include "res\TestApp.rc2" // non-Microsoft Visual C++ edited resources
#ifdef TEST_APP
#include ResourcesDebug.rc
#else
#include ResourcesRelease.rc
#endif
....