C ++ CMenu绘图不正确(非自定义)

时间:2016-03-16 00:28:52

标签: c++ visual-studio-2013 mfc drawing cmenu

我目前正在尝试做一些简单的事情:

CMenu menu;
menu.LoadMenu(IDR_MENU_IMAGE);
CPoint pt;
GetCursorPos(&pt); 
menu.TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this);

当我右键单击时,我得到下面的图像。但是,菜单已加载;当我将光标移动到菜单上时,您可以看到它正好填充子菜单。它可以像我这样动态加载的任何菜单。我试图创建一个指针(CMenu *)并仍然继续遇到这个问题。

这些要点无关紧要(我输入任意点)。

有问题的“this”是派生的CView *类。我点击了一个HWND对象,但是我也尝试使用我点击的这个特定对象的CWnd :: FromHandle()并让对象处理它,但我仍然遇到同样的问题。

我的顶级菜单结构和所有其他菜单都有效 - 仅限于此特定情况。

我真的不想派生C ++ CMenu类只是为了在原始菜单实际工作时覆盖MeasureItem函数,并且在其他版本中工作正常。

帮助?

enter image description here

1 个答案:

答案 0 :(得分: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);