Ошибка Windows LoadMenu: «Указанное имя ресурса не найдено в файле образа». - PullRequest
0 голосов
/ 10 июня 2011

Я пишу программу, которая, помимо прочего, должна отображать контекстное меню при щелчке правой кнопкой мыши.Я перехватываю 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, и я включилсоответствующий .rc.h файл в этом .cpp файле.Фактические идентификаторы диалогового окна, содержащиеся в том же файле .rc, работают отлично.Этот код затем копируется и вставляется из другого проекта, в котором вызов LoadMenu работал отлично: я действительно воссоздал IDR_NED_MENU с нуля, хотя идентификаторы несколько отличаются (но они действительно совпадают между файлом .rc и.cpp файл с фрагментом кода, который я вставил сюда);Первоначально я случайно создал меню в отдельном файле .rc, поэтому попытался исправить это здесь.Я заметил, что в представлении ресурсов Visual Studio диалоговые окна содержатся в папке «Диалог», в то время как они содержатся в папке «Меню» (разумно), но я не уверен, какая разница, если таковая имеется,

* 1022.* Почему я получаю эту ошибку?Почему он не может найти IDR_NED_MENU?

Я использую Visual Studio 2010, и это не проект MFC.Я не уверен, что, если таковые имеются, другие соответствующие детали, которые я должен включить;дайте мне знать в комментариях, и я буду редактировать-обновлять.

Спасибо.

1 Ответ

1 голос
/ 10 июня 2011

Первый параметр LoadMenu должен быть дескриптором вашего исполняемого образа, в котором находится ресурс. Дескриптор является первым HINSTANCE, который вы получаете в WinMain. В качестве альтернативы вы можете получить его по телефону GetModuleHandle(0).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...