【问题标题】:C++ CMenu Drawing Incorrectly (Non-custom)C++ CMenu 绘制不正确(非自定义)
【发布时间】:2016-07-01 16:31:54
【问题描述】:

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

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 函数,并在其他版本中正常工作。..

帮助?

【问题讨论】:

  • 您发布的图片与您的问题内容不符。
  • 除了我没有提到几乎为零宽度的菜单之外,不确定您的意思。但是,我发现问题只是我忘记在msdn.microsoft.com/en-us/library/k5az22fk.aspx 的第一个菜单中包含一个无名选项。
  • 我的意思是图像主要包含垃圾,可能占菜单的 1/3。
  • 背景中的垃圾,当然,但左边的银条实际上是我抱怨的菜单,我包括了右边的菜单,实际上是从左边零宽度菜单以显示它确实存在,实际填充子菜单等。
  • 是的,100% 同意你的看法。这是我能想到的唯一方法来展示这个问题,但它并不是什么好东西。我可能应该注释它。

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


【解决方案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);

【讨论】:

  • 实际上,在这样做之后,我意识到实际问题与句柄等无关 - 只是我需要在菜单中有一个无名选项,根据 @987654322 @ 是一个弹出窗口。这样做,我能够解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多