我正在编写一个程序,除其他外,它需要在右键单击时显示上下文菜单。我正在捕获 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/