我目前正在尝试做一些简单的事情:
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函数,并且在其他版本中可以正常工作。
救命?
最佳答案
使用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);
关于c++ - C++ CMenu绘制不正确(非自定义),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36024766/