В настоящее время я пытаюсь сделать что-то простое:
CMenu menu;
menu.LoadMenu(IDR_MENU_IMAGE);
CPoint pt;
GetCursorPos(&pt);
menu.TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this);
Когда я щелкаю правой кнопкой мыши, я получаю изображение ниже. Тем не менее, меню загружается; когда я перемещаю курсор вниз по меню, вы можете видеть, что он просто заполняет подменю. Это происходит с любым меню, которое я загружаю динамически, как это. Я попытался создать указатель (CMenu *) и все еще продолжаю сталкиваться с этой проблемой.
Точки не имеют значения (я ввожу произвольные точки).
Рассматриваемое «это» является производным классом CView *. Я нажимаю на объект HWND, но я пытался также взять CWnd :: FromHandle () этого конкретного объекта, на который я щелкаю, и объект обрабатывает его, но у меня все еще остается та же проблема.
Моя структура верхнего меню и все остальные меню работают — это только в этом конкретном случае.
Я не хочу выводить класс C ++ CMenu просто для того, чтобы переопределить функцию MeasureItem, когда исходные меню должны работать, и работают нормально в других версиях.
Помогите?
использование GetSubMenu(0)
чтобы получить дескриптор всплывающего окна:
CMenu menu;
menu.LoadMenu(IDR_MENU_IMAGE);
CMenu *submenu = menu.GetSubMenu(0);
if (submenu)
submenu->TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this);
куда IDR_MENU_IMAGE
создается в редакторе ресурсов, похожем на следующее:
IDR_MENU_IMAGE MENU
BEGIN
POPUP "File"BEGIN
MENUITEM "New", ID_FILE_NEW
MENUITEM "Open", ID_FILE_OPEN
MENUITEM "Save", ID_FILE_SAVE
MENUITEM "Save As ...", ID_FILE_SAVEAS
END
END
Результат:
Обратите внимание, что это не будет работать, если есть только «строка меню» и нет всплывающих окон. Меню ниже не может быть создано как всплывающее окно:
IDR_MENU_IMAGE MENU //no popup menu!
BEGIN
MENUITEM "A", IDA
MENUITEM "B", IDB
MENUITEM "C", IDC
END
Вы также можете создать всплывающее меню следующим образом:
CMenu menu;
menu.CreatePopupMenu();
menu.AppendMenu(MF_STRING, ID_FILE_NEW, "New");
menu.TrackPopupMenu(TPM_RIGHTBUTTON, p.x, p.y, this);
Других решений пока нет …