【问题标题】:CMFCPopupMenu menu displayed without contentsCMFCPopupMenu 菜单显示无内容
【发布时间】:2023-03-24 07:46:01
【问题描述】:

我正在使用 CMFCPopupMenu 创建一个右键单击弹出菜单。问题是第一次显示菜单时只显示带有阴影的菜单框架,但内容是白色的。第二次显示菜单时没有问题。代码如下所示:

  CPoint point;
  ::GetCursorPos (&point);

  CMFCPopupMenu* pop = new CMFCPopupMenu(); 

  pop->InsertItem(CMFCToolBarMenuButton(ID_COMMAND_1,NULL,-1,_T("Command 1")));
  pop->InsertItem(CMFCToolBarMenuButton(ID_COMMAND_2,NULL,-1,_T("Command 2")));
  pop->InsertItem(CMFCToolBarMenuButton(ID_COMMAND_3,NULL,-1,_T("Command 3")));
  pop->InsertItem(CMFCToolBarMenuButton(ID_COMMAND_4,NULL,-1,_T("Command 4")));

  pop->Create(this,point.x,point.y,NULL,0,true); 

父类基于CDialogEx。

谢谢。

【问题讨论】:

  • 您可以尝试在InsertItem() 调用之前调用Create() 吗?
  • 我试过了,但有点糟糕。现在它是一个只有一行的空菜单。
  • InsertItem 采用 const CMFCToolBarMenuButton &(即参考),所以可能不保留按钮是个问题?

标签: windows mfc contextmenu


【解决方案1】:

我不明白为什么我的方法不起作用,但我通过在资源中定义菜单找到了解决方法,并这样做:

  CMenu menu;
  menu.LoadMenu(IDR_SESSION_MENU);
  HMENU hMenu = menu.GetSubMenu (0)->Detach ();

  CMFCPopupMenu* pMenu = theApp.GetContextMenuManager()->ShowPopupMenu(hMenu, point.x, point.y, this, TRUE);

这行得通,唯一的问题是,根据状态和选择拥有一个带有动态条目的菜单有点复杂。

【讨论】:

  • 你应该仍然能够在menu.LoadMenu() 之后和获得hMenu 句柄之前操作menu
【解决方案2】:
CMFCPopupMenu* pPopupMenu = new CMFCPopupMenu;
if (pPopupMenu->Create(pWndOwner, point.x, point.y, NULL, FALSE, TRUE))
{
    pPopupMenu->InsertItem(CMFCToolBarMenuButton(57645, NULL, -1, _T("Command 1")), -1);
    pPopupMenu->InsertItem(CMFCToolBarMenuButton(57646, NULL, -1, _T("Command 2")), -1);
    pPopupMenu->RecalcLayout();
}

插入后需要调用RecalcLayout()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-28
    • 2014-12-07
    • 2015-07-22
    • 2014-10-14
    • 2019-05-22
    • 2016-06-18
    • 2016-07-18
    • 2014-01-17
    相关资源
    最近更新 更多