我正在编写一个程序,除其他事项外,需要右键单击显示上下文菜单。我正在捕获WM_NOTIFY
,被点击的控件的标识符,以及NM_RCLICK
。这一切都很好。Windows LoadMenu错误:“在图像文件中找不到指定的资源名称。”
问题是当我处理的是右键单击:
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的资源视图中,对话框包含在Dialog文件夹中,而它包含在Menu文件夹中(明智的),但我不确定是否会产生什么差异。
为什么我会得到这个错误?为什么找不到IDR_NED_MENU
?
我正在使用Visual Studio 2010,这不是一个MFC项目。我不确定我应该包括什么(如果有的话)其他相关细节;让我知道在评论中,我会编辑更新。
谢谢。
人。在这个项目中,我复制了这段代码,它肯定使用了'LoadMenu(0,MAKEINTRESOURCE(IDR_MENU1));'('IDR_MENU1'是旧的ID),并且工作正常。我尝试了'LoadMenu(GetModuleHandle(0),MAKEINTRESOURCE(IDR_NED_MENU));'不过,现在我仍然得到一个'NULL'返回值,'GetLastError'现在给出一个错误消息, null)'... – KRyan 2011-06-10 16:13:49
啊哈,但是这确实让我想到了答案:因为我正在修改一个项目,所以我没有完全自己编写,有一个调用CreateDialogParam'我没有写,并且工作:它为第一个参数使用了一个名为'hModule'的全局'HINSTANCE'变量,并将其用于'LoadMenu'调用!就像ybungalobill建议的一样,'hModule'最初在'DllMain'中定义为等于'hDllHandle'。谢谢! – KRyan 2011-06-10 16:21:26
@DragoonWraith:啊,如果它是一个DLL项目,那是另一回事,你必须在OP中说。每个由您的应用程序加载的DLL都可能拥有自己的具有相同ID的资源,因此您必须指定要使用的DLL的HINSTANCE。 – ybungalobill 2011-06-10 16:56:19