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);
Другие вопросы по тегам