如何在MFC.rc文件的菜单中使用预处理器指令?

如何在MFC.rc文件的菜单中使用预处理器指令?,mfc,Mfc,我希望能够根据运行应用程序的版本动态更改资源文件中的代码。例如,我有一个关于菜单。我希望about菜单项根据预处理器指令有不同的描述。我的问题是我能够添加代码。但是当我编辑并保存资源文件时,.aps文件会覆盖我的预处理器指令。我怎样才能避开这件事?下面的代码是我希望在资源脚本中包含的示例 IDR_EXAMPLE_MENU MENU BEGIN /* Other Menu items */ POPUP "&Help" BEGIN MENUITEM "&Help T

我希望能够根据运行应用程序的版本动态更改资源文件中的代码。例如,我有一个关于菜单。我希望about菜单项根据预处理器指令有不同的描述。我的问题是我能够添加代码。但是当我编辑并保存资源文件时,.aps文件会覆盖我的预处理器指令。我怎样才能避开这件事?下面的代码是我希望在资源脚本中包含的示例

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输出,而这没有任何#define值。你不能两全其美。您可以使用编译器指令手动编辑.rc(或.rc2)文件,或接受VS的输出


一种可能是让您使用资源编辑器在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

....