c++ - Windows LoadMenu 错误 : "The specified resource name cannot be found in the image file."

标签 c++ windows resources contextmenu

我正在编写一个程序,除其他外,它需要在右键单击时显示上下文菜单。我正在捕获 WM_NOTIFY、被单击的控件的标识符和 NM_RCLICK。这一切都很好。

当我处理右键单击时出现问题:

case NM_RCLICK:
{
    HMENU Popup = LoadMenu(0, MAKEINTRESOURCE(IDR_NED_MENU));
    if ( !Popup ) {
        DWORD err = GetLastError();
        char* buf;
        FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ALLOCATE_BUFFER, 0, err, 0, buf, 1<<19, 0);
        _ERROR("LoadMenu(0, MAKEINTRESOURCE(IDR_NED_MENU)); Error '%s' thrown; no menu loaded.", buf);
        delete [] buf;
    }
    Popup = GetSubMenu(Popup, 0);
    CheckMenuItem(Popup, 1, MF_CHECKED|MF_BYPOSITION);

    POINT Point;
    GetCursorPos(&Point);

    switch (TrackPopupMenu(Popup, TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RETURNCMD, Point.x, Point.y, 0, GetActiveWindow(), NULL)) {
        // ...

主要是,LoadMenu(0, MAKEINTRESOURCE(IDR_NED_MENU)); 返回 NULL,我收到一条错误消息,指出“指定的资源名称不能在图像文件中找到。”

现在,IDR_NED_MENU 是我在 .rc 文件中的菜单 ID,并且我在这个 中包含了相应的 .rc.h 文件>.cpp 文件。包含在同一 .rc 文件中的实际对话窗口 ID 可以完美地工作。此代码是从另一个项目中进一步复制和粘贴的,其中 LoadMenu 调用完美运行:不过,我确实从头开始重新创建了 IDR_NED_MENU,并且 ID 有所不同(但它们在 .rc 文件和包含我粘贴到此处的代码片段的 .cpp 文件之间进行匹配);最初我不小心在单独的 .rc 文件中创建了菜单,所以我试图在这里纠正它。我注意到在 Visual Studio 的资源 View 中,对话框包含在 Dialog 文件夹中,而它包含在 Menu 文件夹中(合理),但我不确定这有什么区别(如果有的话)。

为什么我会收到此错误?为什么找不到 IDR_NED_MENU

我使用的是 Visual Studio 2010,这不是 MFC 项目。我不确定我应该包括哪些其他相关细节(如果有的话);在评论中让我知道,我会编辑更新。

谢谢。

最佳答案

LoadMenu 的第一个参数必须是资源所在的可执行镜像的句柄。该句柄是您在 WinMain 中获得的第一个 HINSTANCE。或者,您可以通过调用 GetModuleHandle(0) 来获取它。

关于c++ - Windows LoadMenu 错误 : "The specified resource name cannot be found in the image file.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6308714/

相关文章:

java - 为什么在 C++/Java 和类似语言中以美元符号开头的变量名不好?

c# - UWP 应用 : Process Memory Usage vs Heap Usage

c# - 在 C3 中检测全局键盘钩子(Hook)

java - FileNotFoundException 起始 jar - 在资源文件夹中看不到文件

.net - 资源字符串位置

c++ - SFML + 固定时间步 = 滞后?

C++ 面向对象库

c++ - 正则表达式以匹配sql where条件

c - 向 C 添加程序参数

delphi - Lazarus 是学习 Delphi 的一个不错的选择吗?