Visual Studio 2013 — C ++ CMenu Рисование некорректно (нестандартно)

В настоящее время я пытаюсь сделать что-то простое:

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, когда исходные меню должны работать, и работают нормально в других версиях.

Помогите?

введите описание изображения здесь

1

Решение

использование 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);
2

Другие решения

Других решений пока нет …