Premnath Mali Ответов: 1

Trackpopupmenu нарушение доступа чтение местоположения C++


Я хотел показать всплывающее меню при щелчке правой кнопкой мыши в любом месте диалогового окна

Я создал меню в ресурсах

при использовании TrackPopupMenu с меню я получаю тонкое окно

и при использовании с подменю я получаю эту ошибку

Что я уже пробовал:

void CMenuPraticeDlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
	
	GetCursorPos(&point);
	CMenu menu;
    VERIFY(menu.LoadMenu(IDR_MENU_POPUP));
    CMenu *pSub = menu.GetSubMenu(1);
    // Modify menu items here if necessary (e.g. gray out items)
//Here I'm getting error
    int nCmd = pSub->TrackPopupMenuEx(
        TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_VERPOSANIMATION | TPM_RETURNCMD | TPM_NONOTIFY,
        point.x, point.y, AfxGetMainWnd(), NULL);
    if (nCmd)
        SendMessage(WM_COMMAND, nCmd);

}



POINT pt;
//getting the current cursor point
GetCursorPos(&pt);
//Here I'm getting thin window
menu.TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON,pt.x,pt.y,this );

1 Ответов

Рейтинг:
12

Jochen Arndt

Ошибка, вероятно, в этой строке

CMenu *pSub = menu.GetSubMenu(1);
Когда меню, загруженное из ресурсов, содержит только одно всплывающее меню (что является обычным случаем) GetSubMenu() возвращается NULL.

Так что сдайте позицию 0 вместо.

[РЕДАКТИРОВАТЬ]
При использовании TrackPopupMenu[Ex], меню должно быть всплывающим меню, полученным вызовом CMenu::GetSubMenu() или будучи созданным с помощью CMenu::CreatePopupMenu Использование обычного меню не будет работать.
[/РЕДАКТИРОВАТЬ]


Premnath Mali

Если я прошел 0 все равно получаю ту же ошибку

Jochen Arndt

Тогда у вас, вероятно, не было всплывающего меню в вашем ресурсе IDR_MENU_POPUP.

При открытии RC-файла с помощью текстового редактора он должен выглядеть следующим образом:

МЕНЮ IDR_MENU_POPUP
НАЧАТЬ
Всплывающее окно " menu_name"
НАЧАТЬ
MENUITEM "item text" ITEM_CMD_ID
// ...
КОНЕЦ
КОНЕЦ

Если это не похоже на описанное выше, используйте редактор ресурсов для создания всплывающего меню.

Premnath Mali

Сэр я просто хочу всплывающее меню которое будет всплывать при щелчке правой кнопкой мыши это кажется мы создаем меню а затем внутри этого попоп меню

Я создал меню только с тремя опциями максимизировать минимизировать и выйти вот и все, и я хочу, когда пользователь щелкает правой кнопкой мыши в любом месте диалогового окна, я хочу показать эти меню, как мне это сделать?

Premnath Mali

МЕНЮ IDR_MENU_POPUP
НАЧАТЬ
MENUITEM "Ma& ximize", ID_MAXIMIZE
Пункт меню "мин&усилителя;как на счет минимизировать", ID_MINIMIZE
MENUITEM "E& xit", ID_EXIT
КОНЕЦ

Вот мой код ресурса

Jochen Arndt

Вероятно, вы создали" обычное " меню. Но вы должны создать всплывающее меню.
Специфика Windows заключается в том, что вы должны создать ресурс меню (с пустым "нормальным" меню, не указывая заголовок), который содержит всплывающее меню (или даже больше). См. также https://msdn.microsoft.com/en-us/library/k5az22fk.aspx.

Если вы не хотите этого делать, вы можете использовать CMenu::CreatePopupMenu() и добавить пункты меню в свою программу. Но использование ресурса-это распространенная и более портативная версия.

Premnath Mali

Спасибо теперь я получил именно то что хотел