CMFCMenuButton未关闭

CMFCMenuButton未关闭,menu,mfc,cdialog,popupmenubutton,cmfcmenubutton,Menu,Mfc,Cdialog,Popupmenubutton,Cmfcmenubutton,我有一个带有cfmcmenu按钮的CDialog。当我打开它时,一切都正常显示: 当我点击其他地方关闭菜单时,问题就出现了。菜单似乎无法关闭,除非用户选择它的选项。如果我按键盘上的Escape键,对话框就会自动关闭,这太激烈了;我真的希望它只关闭菜单 我知道我可以通过将资源文件中的属性“OS Menu”设置为True来解决这个问题(或者等效地,将其属性m_bOSMenu=True)。我会得到: 如图所示,后果如下: 我松开图标(不是很重要) 我取消了由OnInitMenuPopup执行的某

我有一个带有
cfmcmenu按钮的
CDialog
。当我打开它时,一切都正常显示:

当我点击其他地方关闭菜单时,问题就出现了。菜单似乎无法关闭,除非用户选择它的选项。如果我按键盘上的Escape键,对话框就会自动关闭,这太激烈了;我真的希望它只关闭菜单

我知道我可以通过将资源文件中的属性“OS Menu”设置为True来解决这个问题(或者等效地,将其属性
m_bOSMenu=True
)。我会得到:

如图所示,后果如下:

  • 我松开图标(不是很重要)
  • 我取消了由
    OnInitMenuPopup
    执行的某些项的禁用(重要)(旁注:第二个菜单栏也是由
    OnInitMenuPopup
    执行的,它看起来应该是这样的)。如果用户单击这些选项,它们将工作,但不应该

如何解决这个问题?

答案直接来自MFC来源

在其
CMFCMenuButton::OnShowMenu
函数中的文件
afxmenubutton.cpp
建议使用
CDialogEx
而不是
CDialog

#ifdef _DEBUG
    if ((pParent->IsKindOf(RUNTIME_CLASS(CDialog))) && (!pParent->IsKindOf(RUNTIME_CLASS(CDialogEx))))
    {
        TRACE(_T("CMFCMenuButton parent is CDialog, should be CDialogEx for popup menu handling to work correctly.\n"));
    }
#endif
然后我将我的dialog类改为派生自
CDialogEx
,现在一切都很好!如果操作系统菜单属性为False,则会显示图标,禁用的选项将被真正禁用并灰显


更新:有关
跟踪
-输出的一些文档也会显示在Visual Studio的调试器中(如果已附加)。咨询源代码比必要的麻烦更多。@ IsCtTable:如果你有一个非常冗长的程序输出,你不会在文本中间找到它。或者如果您禁用了程序输出。调试输出是可搜索的。[Ctrl]+F打开一个文本字段以输入搜索词。MFC类的所有跟踪输出都包含相应的类名。以防万一,你想让你的生活在未来变得更轻松。@IInspectable:我早就知道了。我提出的观点是,你所说的输出在其他文本的中间并不那么明显。