当对象在容器中处于活动状态,将 OLE 的协议菜单文档使对象 帮助 菜单的完全控制。因此,,除非用户停用对象,容器的帮助主题不可用。激活在合并就地菜单的规则文档包容体系结构扩展允许容器,并处于活动状态的共享菜单的活动文档。新规则完成有关哪些组件的其他约定拥有菜单的哪些部分,并且该共享菜单如何构造的。
新的约定是简单的。在活动文档, 帮助 菜单有两个顶级菜单项按如下方式组织:
Help
Container Help >
Object Help >
例如,那么,当 Word 部分是一个 Office 活页夹,则 帮助 菜单如下所示:
Help
Binder Help >
Word Help >
两个菜单项是下所有其他菜单项特定于容器和对象提供给用户的级联菜单中的。哪些项目出现此问题涉及的容器和对象将有所不同。
若要构造此合并的 帮助 菜单,活动文档包容体系结构修改标准 OLE 文档程序。基于 OLE 文档,合并的菜单栏可以具有菜单,即 文件, 编辑, 容器, Object, 窗口, 帮助了六个组,按此顺序。在每组中,可以有零个或多个菜单。组 文件、 容器和 窗口 属于容器,并且组 编辑、 Object, 和 帮助 属于对象。当对象若要执行合并时的菜单,它创建空白菜单栏并将其传递给容器。容器然后插入其菜单,通过调用 IOleInPlaceFrame_Double_Colon_InsertMenus。对象还通过是六个长的值的结构 (OLEMENUGROUPWIDTHS)。在插入菜单后,容器指示某个菜单它在每个添加到该组,然后返回。然后对象插入其菜单,请注意计数菜单在每个容器组中。最后,对象通过合并的菜单栏和每组中包含计数菜单) 的数组 (OLE,返回不透明的 “菜单”描述符处理。之后对象通过处理和合并的菜单栏到容器中,通过 IOleInPlaceFrame_Double_Colon_SetMenu。此时,容器显示合并的菜单栏并通过处理 OLE,因此, OLE 可以执行相应计划菜单消息。
在已修改的活动文档程序,对象必须先初始化 OLEMENUGROUPWIDTHS 元素在通过之前为零到容器。然后容器执行常规菜单插入有一个例外:容器插入一个 帮助 菜单为最后一项和存储中的值为 1 OLEMENUGROUPWIDTHS 数组 (即宽度 [5] 的最后一个 (第六项),属于对象的帮助组)。此 帮助 菜单如只有是子菜单的项目, “Container Help _AMPL_gT_”级联菜单。
对象并执行其正常菜单插入代码,不同之处在于,在插入其 帮助 菜单之前,它检查 OLEMENUGROUPWIDTHS 数组的第六项。如果该值为 1,而最后一个菜单的名称为 帮助 (或相应的本地化字符串),然后对象插入其充当容器的 帮助 菜单的子菜单中 帮助 菜单。
对象并设置 OLEMENUGROUPWIDTHS 的第六个元素由一个零并递增第五个元素。此通知 OLE 帮助 菜单属于容器,并应路由与该菜单 (及其子菜单对应的) 菜单消息添加到容器。它是然后容器的职责转发 WM_INITMENUPOPUP, WM_SELECT、 WM_COMMAND和属于 帮助 菜单的对象的其他菜单相关的消息。这种状态的使用 WM_INITMENU 清除调用容器的标志用户是否导航到对象的 帮助 菜单。容器然后注意 WM_MENUSELECT 项添加到或在容器不添加自己的 帮助 菜单中的所有项目退出。在项,这意味着用户导航到对象菜单,因此,容器 “对象 " 帮助 " 菜单”设置标志并使用该标志状态向前所有 WM_MENUSELECT、 WM_INITMENUPOPUP和 WM_COMMAND 消息,作为最小值,到对象窗口。(在退出,容器清除标志然后处理这些消息。)容器应当为这些消息使用来自对象的 IOleInPlaceActiveObejct::GetWindow 函数返回的窗口为目标。
如果对象检测到 OLEMENUGROUPWIDTHS的第六个元素的零,它基于 normal OLE 执行文档规则。此过程包括参与合并 帮助 的菜单不的容器以及一些。
当对象在显示之前调用 IOleInPlaceFrame::SetMenu时,合并的菜单栏,容器检查 帮助 菜单是否有一个附加的子菜单,以及内容外容器插入到。如果是这样,容器在合并的菜单栏将其 帮助 菜单中。如果 帮助 菜单没有有一个附加的子菜单,从容器合并的菜单栏中移除其 帮助 菜单。此过程包括参与合并 帮助 的菜单不的对象以及一些。
最后,在中,当为时拆分菜单时,除了移除其他插入的菜单外,对象中移除插入的 帮助 菜单。当容器中移除其菜单,它将移除其 帮助 菜单而该插入的其他菜单外。