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:我早就知道了。我提出的观点是,你所说的输出在其他文本的中间并不那么明显。