【问题标题】:Concatenate String in resource file and pass it to menu item string (winapi) c++连接资源文件中的字符串并将其传递给菜单项字符串(winapi)c ++
【发布时间】:2018-08-31 10:27:45
【问题描述】:

我正在使用 winapi 编写一个 win32 应用程序 我想在我的资源文件中连接一个字符串,并将搅拌作为它应该显示的字符串给我的菜单项。 当我想把它交给一个控件时,它就像一个魅力,但是当我想要 将它用于 menuItem 我收到一条错误消息。这可能是因为预处理器没有将连接视为字符串?

有人知道我可以尝试什么吗? 我试图关注类似的帖子 - 但它给了我相同的结果......

其他帖子:

Concatenate string and constant in resource file in C++ (MFC)

Concate define and string in resources

C/C++ Macro string concatenation

当我遵循这些答案时,大多数时候我得到“ID_ABOUT_STR”作为我的输出而不是它的值......否则我得到了错误......

我希望问题很清楚,并提前感谢您的努力:)

.rc 文件:

IDR_MENU1 MENU
BEGIN
    POPUP L"System"
    BEGIN
        MENUITEM ID_EXIT_STR, ID_SYSTEM_EXIT
        MENUITEM SEPARATOR
        MENUITEM ID_ABOUT_STR, ID_SYSTEM_ABOUT //here i want to give it the ID_ABOUT_STR which is in the resource file... 
    END
END

resource.h : VER_PRODUCTNAME_STR 和另一个也只包含字符串

#define ID_ABOUT_STR                 L"About" VER_PRODUCTNAME_STR L" " VER_FILE_DESCRIPTION_STR

这是我得到的错误:

Error       RC2122  unknown menu subtype                PRO-PRODUCITON      C:\XXX.rc       195 
Error       RC2125  expected ID value for menu item     PRO-PRODUCITON      C:\XXX.rc       195 

【问题讨论】:

标签: c++ winapi menuitem string-concatenation resource-files


【解决方案1】:

从我的角度来看,问题是 L 扩展。代码应该在没有 L"..." 前缀的情况下编译。

正如您的链接所示,此宏在 RC 编译器中可以正常工作

#define CONCAT(a,b) a##b
#define STRINGIZE_(x) #x
#define STRINGIZE(x) STRINGIZE_(x)

作为示例,这适用于对话框中的标题

CAPTION STRINGIZE(CONCAT(Concat,Title))

但他们不使用 L"..." 前缀

【讨论】:

  • 我在没有 L 前缀以及 stringize 和 concat 的情况下尝试了它 - 这给了我错误:RC2104 undefined keyword or key name: about\ 真正奇怪的是,在我使用的其他控件上在 rc 文件中,即使没有使用 concat,它也可以工作。只有菜单项似乎有问题。
猜你喜欢
  • 2014-03-19
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多