多文档应用程序,菜单获取焦点弹出子菜单,菜单失去焦点,子菜单不能自动消失

zqlxe 2013-09-03 03:57:43
Vs2010生成 多文档应用程序 ,点击菜单,移动鼠标,
当经过级联菜单是子菜单弹出,但是当菜单失去焦点时,即鼠标已经在视图区域,子菜单不会自动消失,
除非子菜单获取点击事件 或者 其他子菜单获取鼠标焦点 或者 获取点击事件
效果图:



各位大牛 帮忙解决下 谢谢了
...全文
612 21 打赏 收藏 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
chinshinelaoliao 2015-09-12
  • 打赏
  • 举报
回复
这个问题是“CMFCPopupMenuBar”的一个Bug。“CMFCPopupMenuBar”在切换热点菜单项而关闭 前面打开的弹出菜单动作,是通过定时器进行的,其定时由静态“UINT”成员变量“m_uiPopupTimerDelay”确定。 “m_uiPopupTimerDelay”在函数: int CMFCPopupMenuBar::OnCreate(LPCREATESTRUCT lpCreateStruct) 中只做一次初始化,就是从注册表读“MenuShowDelay”的值: [HKEY_CURRENT_USER\Control Panel\Desktop] "MenuShowDelay"="0" “MenuShowDelay”是一个系统变量,通常Windows系统将其设置为0。 “CMFCPopupMenuBar”的Bug在于关闭打开的子菜单在定时器函数中执行,启动定时器语句为: afxPopupMenuBar.cpp,第968行: SetTimer(AFX_TIMER_ID_MENUBAR_REMOVE, max(0, m_uiPopupTimerDelay - 1), NULL); 可见,如果“m_uiPopupTimerDelay”为0,“UINT”型的“m_uiPopupTimerDelay - 1”就等于0xFFFFFFFF。 定时时间基本就是无穷大,定时永远无法达到。 解决该问题的方法有两个: 1) 将注册表中“MenuShowDelay”值设置为一个不为0的较小值; 2) 程序主框架Mainfrm的“OnCreate”中动态将“m_uiPopupTimerDelay”改变为一个不为0的较小值,如: CCSPopupMenuBar::EnablePopupMenuAutoClose(1); CCSPopupMenuBar类如下: class CCSPopupMenuBar : public CMFCPopupMenuBar { public: CCSPopupMenuBar() : CMFCPopupMenuBar() { m_uiPopupTimerDelay = 15;}; virtual ~CCSPopupMenuBar(){} static void EnablePopupMenuAutoClose( DWORD dwDelay ){ m_uiPopupTimerDelay = dwDelay;} public: };
大漠飞狐 2015-05-29
  • 打赏
  • 举报
回复
引用 9 楼 VisualEleven 的回复:
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
	// TODO: Add your specialized code here and/or call the base class
	if(WM_MOUSEMOVE == pMsg->message)
	{
		CPoint pt;
		GetCursorPos(&pt);
		HWND hWnd = ::WindowFromPoint(pt);
		if(NULL != hWnd)
		{
			TCHAR szClassName[MAX_PATH] = {0};
			GetClassName(hWnd, szClassName, _countof(szClassName));
			
			TCHAR szMenu[MAX_PATH] = {0};
			GetClassName(m_wndMenuBar.GetSafeHwnd(), szMenu, _countof(szMenu));

			CString strText;
			strText.Format(_T("%s === %s"), szClassName, szMenu);
			SetWindowText(strText);

			if(0 != _tcscmp(szClassName, szMenu))
			{
				ScreenToClient(&pt);
				PostMessage(WM_LBUTTONDOWN, MAKEWPARAM(pt.x, pt.y), 0);
			}
		}
	}
	return CMDIFrameWndEx::PreTranslateMessage(pMsg);
}
试试这样行不?可能效果不太好~
谢谢您了,根据你的提示,我找到这个函数,原来是最后一句出问题 ,,,,,return CMDIFrameWndEx::PreTranslateMessage(pMsg);这里少了个Ex, 怪不得收不到消息.
大漠飞狐 2015-05-29
  • 打赏
  • 举报
回复
同问,有人解决吗?
向立天 2013-10-07
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
zqlxe 2013-09-05
  • 打赏
  • 举报
回复
引用 15 楼 zhangqianglxiaoe 的回复:
[quote=引用 14 楼 VisualEleven 的回复:] [quote=引用 12 楼 zhangqianglxiaoe 的回复:] 上面没有说清楚, 鼠标的当前位置在 下拉菜单 "打印设置(R)" , 但是“打开已关闭图表” 的 子菜单 任然存在, 怎么弄
这个应该是会自动关闭的,这个是系统的自身的行为,应该不需要我们做额外的控制吧。 我测试了一下我本地的demo工程,之前弹出的菜单会自动关闭,当你鼠标移动到另外一个菜单项上的时候[/quote] 呵呵 我不知道为什么了 , 你说的很对 你的机子上就可以很正常的运行, 但是我这边的机子就是不可以 , 不知道为什么, 怎么办啊 是不是注册表的原因啊 我这边新建的demo也有这种情况, 但是在同事的自己上却能很正常的运行, 不知道是什么原因 而且你应该可以看到我前面给你发的图片 焦点已经不再“已打开图表”上了 就是这么奇怪 不知道该怎么办才好,希望得到好的解决问题[/quote] 请问 现在没有好的办法可以解决这个问题吗 是机子的问题吗 可不可以解决啊
zqlxe 2013-09-05
  • 打赏
  • 举报
回复
难道大牛们束手无策吗 ?? 还是分太低了啊 求解决啊
zqlxe 2013-09-04
  • 打赏
  • 举报
回复
唉 IT无牛人啊 我的这个问题为什么现在都解决不了啊
zqlxe 2013-09-04
  • 打赏
  • 举报
回复
大牛门提个建议吧 弄好了加分 主要还是想知道是什么原因
zqlxe 2013-09-04
  • 打赏
  • 举报
回复
引用 14 楼 VisualEleven 的回复:
[quote=引用 12 楼 zhangqianglxiaoe 的回复:] 上面没有说清楚, 鼠标的当前位置在 下拉菜单 "打印设置(R)" , 但是“打开已关闭图表” 的 子菜单 任然存在, 怎么弄
这个应该是会自动关闭的,这个是系统的自身的行为,应该不需要我们做额外的控制吧。 我测试了一下我本地的demo工程,之前弹出的菜单会自动关闭,当你鼠标移动到另外一个菜单项上的时候[/quote] 呵呵 我不知道为什么了 , 你说的很对 你的机子上就可以很正常的运行, 但是我这边的机子就是不可以 , 不知道为什么, 怎么办啊 是不是注册表的原因啊 我这边新建的demo也有这种情况, 但是在同事的自己上却能很正常的运行, 不知道是什么原因 而且你应该可以看到我前面给你发的图片 焦点已经不再“已打开图表”上了 就是这么奇怪 不知道该怎么办才好,希望得到好的解决问题
Eleven 2013-09-04
  • 打赏
  • 举报
回复
引用 12 楼 zhangqianglxiaoe 的回复:
上面没有说清楚, 鼠标的当前位置在 下拉菜单 "打印设置(R)" , 但是“打开已关闭图表” 的 子菜单 任然存在, 怎么弄
这个应该是会自动关闭的,这个是系统的自身的行为,应该不需要我们做额外的控制吧。 我测试了一下我本地的demo工程,之前弹出的菜单会自动关闭,当你鼠标移动到另外一个菜单项上的时候
zhangqianglovec 2013-09-04
  • 打赏
  • 举报
回复
我不会 感觉很闹,visualeleven 帮帮忙啊 大牛
zqlxe 2013-09-04
  • 打赏
  • 举报
回复
上面没有说清楚, 鼠标的当前位置在 下拉菜单 "打印设置(R)" , 但是“打开已关闭图表” 的 子菜单 任然存在, 怎么弄
zqlxe 2013-09-04
  • 打赏
  • 举报
回复
我的鼠标的当前位置在 下拉菜单 "打印设置(R)" , 但是“打开已关闭图表” 任然存在 怎么弄
zqlxe 2013-09-04
  • 打赏
  • 举报
回复
哈哈 看到效果了 在鼠标离开下拉菜单的时候可以看到效果了,如果鼠标这时任然在下拉菜单上,但是对应的下拉菜单项没有子菜单,那么上一次的下拉菜单对应的子菜单还是没有消失,不知道我说的你理解没有 ,这个怎么办啊
这个是效果图: 此时鼠标任然没有离开下拉菜单,只是他对应的菜单项没有子菜单,怎么办 大牛

Eleven 2013-09-04
  • 打赏
  • 举报
回复
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
	// TODO: Add your specialized code here and/or call the base class
	if(WM_MOUSEMOVE == pMsg->message)
	{
		CPoint pt;
		GetCursorPos(&pt);
		HWND hWnd = ::WindowFromPoint(pt);
		if(NULL != hWnd)
		{
			TCHAR szClassName[MAX_PATH] = {0};
			GetClassName(hWnd, szClassName, _countof(szClassName));
			
			TCHAR szMenu[MAX_PATH] = {0};
			GetClassName(m_wndMenuBar.GetSafeHwnd(), szMenu, _countof(szMenu));

			CString strText;
			strText.Format(_T("%s === %s"), szClassName, szMenu);
			SetWindowText(strText);

			if(0 != _tcscmp(szClassName, szMenu))
			{
				ScreenToClient(&pt);
				PostMessage(WM_LBUTTONDOWN, MAKEWPARAM(pt.x, pt.y), 0);
			}
		}
	}
	return CMDIFrameWndEx::PreTranslateMessage(pMsg);
}
试试这样行不?可能效果不太好~
zqlxe 2013-09-04
  • 打赏
  • 举报
回复
有没有什么好的解决方案啊 请指教 OK了100分
zqlxe 2013-09-04
  • 打赏
  • 举报
回复
引用 4 楼 zhangqianglovec 的回复:
真的没有人可以解决吗 不会吧 大牛们 应该不是很难啊
我想在就是想移开鼠标时 消失 这种情况 请问大牛怎么解决
zqlxe 2013-09-04
  • 打赏
  • 举报
回复
en 首先感谢你回复我的帖子, 我感到这个问题我解决不了所以采求助你们了 , 现在我就是想让这种情况不出现 , 就是你菜单失去焦点的时候,她就自动消失, 希望给些意见, 我还看到一种现象是:在其他的电脑上,是没有这种情况的 ,但不是绝对的,有的电脑上确实有这种情况 ,给些建议把
Eleven 2013-09-04
  • 打赏
  • 举报
回复
菜单项都是这样的,你点击其它地方,应该会消失的。
你希望鼠标移开菜单就消息?不需要点击其它地方???
zhangqianglovec 2013-09-04
  • 打赏
  • 举报
回复
真的没有人可以解决吗 不会吧 大牛们 应该不是很难啊
加载更多回复(1)
内容概要:本文聚焦于“基于中间电容应力分担机制的三阶立方体双向DC-DC变换器”的建模与优化设计,系统阐述其在dq域下的动态建模方法与控制策略优化,涵盖变频与移相协同控制、高电压增益实现、降频软启动、多模式平滑切换等核心技术。结合Matlab、Simulink及PSCAD仿真平台,深入实现全桥LLC、双三相LLC等谐振变换器的混合控制与动态响应分析,并拓展至飞轮储能系统、混合储能平抑风电波动、直流母线电压稳定控制等实际应用场景,构建了从器件级建模到系统级集成的完整仿真体系。同时包含多项高水平期刊论文的复现内容,强化科研可重复性与工程实用性。; 适合人群:电力电子、电气工程及其自动化等相关专业的研究生、科研人员及从事新能源发电、储能系统、电动汽车、智能电网等领域研发的工程技术人员;具备电路拓扑分析、控制系统设计及仿真基础者更佳。; 使用场景及目标:①掌握高频双向DC-DC变换器的精确建模与先进控制方法;②复现并验证权威期刊论文中的关键仿真案例,提升科研创新能力与仿真技术水平;③应用于储能系统能量管理、新能源并网调控、电动汽车充放电模块等高性能电源变换系统的优化设计与动态性能分析。; 阅读建议:建议按照文档目录结构循序渐进学习,优先理解主拓扑的工作原理与控制逻辑,结合所提供的仿真模型进行实操复现,重点关注不同工况下的动态响应、稳定性边界及模式切换过程,深化对电力电子系统协同控制与多时间尺度动态特性的理解。
内容概要:本文系统研究了基于序贯蒙特卡洛模拟法的配电网可靠性评估方法,并通过Matlab代码实现了算法的仿真与复现。文章深入阐述了该方法在电力系统可靠性分析中的理论基础,通过模拟电力元件的故障与修复过程的时间序列,对配电网的关键可靠性指标(如系统平均停电频率SAIFI、平均停电持续时间SAIDI等)进行精确统计评估。研究结合IEEE标准测试系统,详细展示了状态转移抽样、时序仿真流程设计及可靠性指标计算等关键技术环节的实现方法。该方法能够有效处理复杂配电网络中元件的随机性、相关性与时序特性,为电网的规划、运行维护及风险评估提供了科学、可靠的决策依据。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及从事电力系统可靠性分析的工程技术人员。; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在配电网可靠性评估中的应用原理与实现技巧;②学习如何通过时序仿真评估SAIFI、SAIDI等核心可靠性指标;③为电网规划、故障风险分析和运维策略制定提供量化分析工具; 阅读建议:此资源以Matlab代码为核心载体,强调理论与实践的紧密结合,建议读者在学习过程中仔细研读算法原理,动手运行并调试所提供的代码,深入理解状态抽样、时序推进和指标统计的每一个细节,以达到融会贯通的目的。

15,976

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧