嵌入原理是设置将对话框设置为父窗口:m_excelHwnd =  ::FindWindow(NULL, m_exlApp.get_Caption());
::SetParent(m_excelHwnd,this->m_hWnd);一开始本机测试能正常运行,Excel有菜单栏;运行一段时间发现菜单栏消失,更换换其他机器测试时也发现Excel菜单栏消失,Excel版本是2007。请教如何解决Excel菜单栏消失的诡异现象。

解决方案 »

  1.   

     全部显示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 属性以返回代表该菜单的命令栏。
      

  2.   

    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
      

  3.   

    补充一下自己的新发现:内嵌的Excel在获取焦点后,如果按下Ctrl+F2,会出现打印预览界面,再按下ESC退出,则菜单栏恢复。
      

  4.   


    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调出代码后粘贴执行仍然无效。
      

  5.   

    执行完企图恢复菜单栏的脚本之后,模拟按F5键刷新一下当前窗口?
    PostMessage(wnd, WM_KEYDOWN, VK_F5, 0);
      

  6.   

    执行脚本是无效的,根本无法恢复菜单栏。目前唯一有效的方法是ctrl+f2,然后esc退出,但是这样又引出很多新问题,比如excel子窗口必须先获取焦点,发消息不一定百分百进入打印预览界面,进入预览界面也不一定保证esc退出。
      

  7.   

    请问大神,你这个嵌入能分享详细一点吗,我最近也在做dialog上面显示excel,就是卡在了嵌入这一块。求指导,我的QQ:387841812,麻烦您如果不忙的话能知道一下,谢谢,这个问题困扰了我一个星期了。