2011-06-10 71 views
0

我正在编写一个程序,除其他事项外,需要右键单击显示上下文菜单。我正在捕获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项目。我不确定我应该包括什么(如果有的话)其他相关细节;让我知道在评论中,我会编辑更新。

谢谢。

回答

1

LoadMenu的第一个参数必须是资源所在的可执行映像的句柄。该句柄是您在WinMain中获得的第一个HINSTANCE。或者,您可以拨打电话GetModuleHandle(0)获取。

+0

人。在这个项目中,我复制了这段代码,它肯定使用了'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

+0

啊哈,但是这确实让我想到了答案:因为我正在修改一个项目,所以我没有完全自己编写,有一个调用CreateDialogParam'我没有写,并且工作:它为第一个参数使用了一个名为'hModule'的全局'HINSTANCE'变量,并将其用于'LoadMenu'调用!就像ybungalobill建议的一样,'hModule'最初在'DllMain'中定义为等于'hDllHandle'。谢谢! – KRyan 2011-06-10 16:21:26

+0

@DragoonWraith:啊,如果它是一个DLL项目,那是另一回事,你必须在OP中说。每个由您的应用程序加载的DLL都可能拥有自己的具有相同ID的资源,因此您必须指定要使用的DLL的HINSTANCE。 – ybungalobill 2011-06-10 16:56:19

相关问题