2016-03-16 5 views
1

В настоящее время я пытаюсь сделать что-то простое:C++ CMenu Drawing Некорректно (Non-пользовательский)

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

Помощь?

enter image description here

+0

изображения вы вывесили на самом деле не соответствуют содержанию вашего вопроса. –

+0

Не знаете, что вы имеете в виду, кроме меня, не говоря уже о меню с нулевой шириной. Тем не менее, я выяснил, что проблема состояла в том, что я забыл включить параметр no-name в качестве самого первого меню в соответствии с https://msdn.microsoft.com/en-us/library/k5az22fk.aspx. – RootAtShell

+0

Я имею в виду, что изображение содержит главным образом нежелательную и, возможно, 1/3 меню. –

ответ

2

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

Результат:

enter image description here

Обратите внимание, что это не будет работать, если есть только «панель меню», и всплывающее окно не отображается. Меню ниже, не может быть создан как всплывающие окна:

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); 
+0

На самом деле, после этого я понял, что фактическая проблема не связана ни с чем с ручками и т. Д. - это было просто то, что мне нужно было иметь опцию без имени в меню в соответствии с https://msdn.microsoft.com /en-us/library/k5az22fk.aspx для всплывающего окна. Сделав это, я смог исправить эту проблему. – RootAtShell