我正在編寫一個程序,除其他事項外,需要右鍵單擊顯示上下文菜單。我正在捕獲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