MFC对话框中嵌入Excel窗口造成Excel菜单栏消失的诡异现象

psp7456 2017-02-24 11:20:34

嵌入原理是设置将对话框设置为父窗口:

m_excelHwnd = ::FindWindow(NULL, m_exlApp.get_Caption());
::SetParent(m_excelHwnd,this->m_hWnd);

一开始本机测试能正常运行,Excel有菜单栏;运行一段时间发现菜单栏消失,更换换其他机器测试时也发现Excel菜单栏消失,Excel版本是2007。请教如何解决Excel菜单栏消失的诡异现象。
...全文
348 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_37795055 2019-06-17
  • 打赏
  • 举报
回复
请问大神,你这个嵌入能分享详细一点吗,我最近也在做dialog上面显示excel,就是卡在了嵌入这一块。求指导,我的QQ:387841812,麻烦您如果不忙的话能知道一下,谢谢,这个问题困扰了我一个星期了。
psp7456 2017-02-27
  • 打赏
  • 举报
回复
引用 6 楼 赵4老师的回复:
执行完企图恢复菜单栏的脚本之后,模拟按F5键刷新一下当前窗口?
	PostMessage(wnd, WM_KEYDOWN, VK_F5,	0);
执行脚本是无效的,根本无法恢复菜单栏。目前唯一有效的方法是ctrl+f2,然后esc退出,但是这样又引出很多新问题,比如excel子窗口必须先获取焦点,发消息不一定百分百进入打印预览界面,进入预览界面也不一定保证esc退出。
赵4老师 2017-02-27
  • 打赏
  • 举报
回复
执行完企图恢复菜单栏的脚本之后,模拟按F5键刷新一下当前窗口?
	PostMessage(wnd, WM_KEYDOWN, VK_F5,	0);
psp7456 2017-02-25
  • 打赏
  • 举报
回复
请大神指点~~~
赵4老师 2017-02-24
  • 打赏
  • 举报
回复
CommandBars 属性 请参阅 应用于 示例 特性 返回 CommandBars 对象,该对象代表 Microsoft Excel 命令栏。只读。 说明 同 Application 对象一起使用。本属性返回所有对该应用程序有效的内置及自定义命令栏。 如果工作薄嵌入在另一个应用程序中并且用户双击激活了该工作薄,使用本属性及 Workbook 对象可以返回 Microsoft Excel 的所有在该应用程序中有效的命令栏集合。其他任何时候与 Workbook 对象共同使用本属性将返回 Nothing。 没有程序化的方法可用来返回附属于工作薄的命令栏集合。 示例 本示例删除所有不可见的自定义命令栏。 For Each bar In Application.CommandBars If Not bar.BuiltIn And Not bar.Visible Then bar.Delete Next
赵4老师 2017-02-24
  • 打赏
  • 举报
回复
全部显示 CommandBars 集合对象 请参阅 属性 方法 事件 特性 CommandBars (CommandBar) CommandBarControls (CommandBarControl) CommandBarButton CommandBarComboBox CommandBarPopup 一个代表容器应用程序中工具栏的 CommandBar 对象集合。 使用 CommandBars 集合 用 CommandBars 属性可返回 CommandBars 集合。以下示例在 Immediate 窗口显示每个菜单栏和工具栏的名称和本地名称,并显示一个数值以表明该菜单栏或工具栏是否出现在屏幕上。 For Each cbar in CommandBars Debug.Print cbar.Name, cbar.NameLocal, cbar.Visible Next 用 Add 方法可在集合中添加一个新的命令栏。以下示例创建一个自定义工具栏“Custom1”并将其作为浮动工具栏显示。 Set cbar1 = CommandBars.Add(Name:="Custom1", Position:=msoBarFloating) cbar1.Visible = True 用 CommandBars(index) 可返回一个 CommandBar 对象;此处 index 是该命令栏的名称或索引号。以下示例将工具栏“Custom1”固定在应用程序窗口的底部。 CommandBars("Custom1").Position = msoBarBottom 注意 可用名称或索引号指定位于容器应用程序的有效菜单栏和工具栏列表中的菜单栏或工具栏,但只能用名称指定菜单、快捷菜单或子菜单(所有这些内容均可由 CommandBar 对象表示)。 如果两个或两个以上的自定义菜单或子菜单具有相同的名称,那么 CommandBars(index) 返回第一个具有该名称的菜单。为确保返回正确的菜单或子菜单,可找到显示该菜单的弹出式控件,然后对该弹出式控件使用 CommandBar 属性以返回代表该菜单的命令栏。
psp7456 2017-02-24
  • 打赏
  • 举报
回复

Sub aaa()
Dim aa, bb As Boolean
aa = True
bb = False
Application.CommandBars("ply").Enabled = aa
'右键点工作表标签是否可用
Application.CommandBars("cell").Enabled = aa
'右键点单元格是否可用
Application.CommandBars("toolbar list").Enabled = aa
'右键点工具栏及“视图”-“工具栏”是否可用
Application.CommandBars("autocalculate").Enabled = aa
'右键点状态栏是否可用
Application.CommandBars("worksheet menu bar").Enabled = aa
Application.CommandBars(1).Enabled = aa
'以上两句的作用都是把菜单取消
Application.CommandBars(2).Enabled = aa
'暂时未知
Application.CommandBars(3).Enabled = aa
'常用工具栏是否可用
'Application.CommandBars(3).Controls(3).Enabled = aa
'使常用工具栏中第三个“保存”是否可用
Application.CommandBars(4).Enabled = aa
'格式工具栏是否可用
Application.CommandBars(5).Enabled = aa
'暂时未知
Application.CommandBars(1).Enabled = aa
'恢复菜单可用
Application.CommandBars(1).Controls(1).Enabled = aa
'使菜单中的“文件”是否可用
'Application.CommandBars("file").Controls("页面设置(&U)...").Enabled = aa
'菜单中的“文件”中的“页面设置”是否可用
Application.CommandBars(1).Controls(4).Enabled = aa
'菜单中的第四个“插入”是否可用
Application.CommandBars(1).Controls(4).Caption = "victor"
'更改名称
Application.CommandBars(1).Reset
'恢复菜单
Application.DisplayFormulaBar = aa
'编辑栏是否显示
Application.DisplayStatusBar = aa
'状态栏是否显示
ActiveWindow.DisplayHeadings = aa
'行号列标是否显示
ActiveWindow.DisplayWorkbookTabs = aa
'工作表标签是否显示
ActiveWindow.DisplayHorizontalScrollBar = aa
'水平滚动条是否显示
ActiveWindow.DisplayVerticalScrollBar = aa
'垂直滚动条是否显示
End Sub
从网上找到的恢复脚本,Alt+F11调出代码后粘贴执行仍然无效。
psp7456 2017-02-24
  • 打赏
  • 举报
回复
补充一下自己的新发现:内嵌的Excel在获取焦点后,如果按下Ctrl+F2,会出现打印预览界面,再按下ESC退出,则菜单栏恢复。

15,979

社区成员

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

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