如何在MFC .rc文件中的MENU中使用预处理程序指令?

时间:2017-12-04 18:16:20

标签: mfc

我希望能够动态更改资源文件中的代码,具体取决于正在运行的应用程序版本。例如,我有一个关于菜单。我希望about menuitem基于预处理器指令有不同的描述。我遇到的问题是我能够添加代码。但是当我编辑资源文件并保存它时,.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

如果我正在运行TEST版本,我希望它在menuitem中显示“About TEST”,如果是RELEASE版本,我希望它显示“关于RELEASE” 如何在保存.rc文件时没有.aps文件覆盖预处理程序指令的情况下,如何将这样的代码添加到我的资源文件中?

修改:This explains how files are affected by resource editing.

3 个答案:

答案 0 :(得分:3)

在资源文件中也可以有两个像e菜单这样的资源。

每个资源的属性都可以包含条件。并且您可以在资源中使用两次具有相同名称的资源。

enter image description here

您可以将条件_DEBUG添加到第一个资源。只需复制它并给出条件_RELEASE。将其重命名为相同的Id。

enter image description here

答案 1 :(得分:1)

您可以将代码放在单独的rc文件中,并使用 Set includes 对话框的Compile-Time Directives字段将其包含在内。见Using Multiple Resource Files in the Same Project

如果资源没有经常更改,您可以将它们移动到资源编辑器未修改的.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):

#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

....

更多链接:

答案 2 :(得分:1)

您希望能够使用VS的资源编辑器,但它只知道如何生成1种.rc输出,并且没有任何#define值。你不可能两种方式。您可以使用编译器指令并手动编辑.rc(或.rc2)文件,或接受VS的输出。

可能是允许您使用资源编辑器在VS中编辑文件,然后编写一个后处理程序,该程序可以理解.RC的一般内容并重新生成"期望&# 34; .RC用编译器指令替换原始内容。它是可行的,但权衡取决于您的应用程序。