帮助菜单合并

当对象在容器中处于活动状态时,OLE Documents 的菜单合并协议会提供对象对 帮助 菜单的完全控制。 因此,除非用户停用该对象,否则容器的帮助主题不可用。 活动文档容器架构扩展了就地菜单合并的规则,使得容器和活跃的文档能够共享菜单。 新规则只是有关组件拥有哪个菜单部分以及如何构造共享菜单的其他约定。

新约定很简单。 在活动文档中, “帮助 ”菜单有两个按如下所示组织的顶级菜单项:

Help

Container Help >

Object Help >

例如,当 Word 节在 Office Binder 中处于活动状态时,“ 帮助 ”菜单将如下所示:

Help

Binder Help >

Word Help >

这两个菜单项都是级联菜单,其中与容器和对象相关的任何额外菜单项都会提供给用户。 此处显示的项因涉及的容器和对象而异。

为了构造此合并的帮助菜单,活动文档容器架构将对正常的 OLE 文档过程进行修改。 根据 OLE 文档,合并的菜单栏可以有六组菜单,即 “文件”、“ 编辑”、“ 容器”、“ 对象”、“ 窗口”、“ 帮助”等。 在每个组中,可以有零个或多个菜单。 文件容器窗口组属于容器,组“编辑”、“对象”和“帮助”属于该对象。 当对象想要执行菜单合并时,它会创建一个空白菜单栏并将其传递给容器。 然后,容器通过调用 IOleInPlaceFrame::InsertMenus插入其菜单。 该对象还传递一个结构,该结构是六个 LONG 值的数组(OLEMENUGROUPWIDTHS)。 插入菜单后,容器会标记它在其每个组中添加的菜单数,然后返回。 然后,对象插入其菜单,并注意每个容器组中的菜单计数。 最后,该对象将合并的菜单栏和数组(其中包含每个组中的菜单计数)传递给 OLE,这将返回不透明的“菜单描述符”句柄。 稍后,该对象将通过IOleInPlaceFrame::SetMenu将该句柄和合并后的菜单栏传递到容器。 此时,容器会显示合并的菜单栏,并将句柄传递给 OLE,以便 OLE 可以正确调度菜单消息。

在修改的活动文档过程中,对象必须先将 OLEMENUGROUPWIDTHS 元素初始化为零,然后再将其传递给容器。 然后,容器执行常规菜单插入,但有一个例外:容器将 帮助 菜单作为最后一项插入,并将值 1 存储在 OLEMENUGROUPWIDTHS 数组(即宽度[5])中,该值属于对象的帮助组。 此 帮助 菜单将仅包含一个子菜单(如前所述“容器帮助>”级联菜单)的项。

然后,该对象执行其普通菜单插入代码,但插入 帮助 菜单之前,它会检查 OLEMENUGROUPWIDTHS 数组的第六个条目。 如果值为 1,并且最后一个菜单的名称为“帮助”(或适当的本地化字符串),则对象将“帮助”菜单作为容器的“帮助”菜单的子菜单插入。

然后,该对象将 OLEMENUGROUPWIDTHS 的第六个元素设置为零,并将第五个元素递增一个。 这让 OLE 知道 帮助 菜单属于容器,应将对应于该菜单(及其子菜单)的菜单消息路由到容器。 然后,容器负责转发 WM_INITMENUPOPUPWM_SELECTWM_COMMAND 和其他与菜单相关的消息,这些消息属于对象部分的“帮助”菜单。 这是通过使用 WM_INITMENU 清除一个标志来完成的,该标志告知容器用户是否已导航到对象的 “帮助 ”菜单。 然后,容器会监视WM_MENUSELECT以检测进入或退出容器未自行添加到“帮助”菜单的任何项目。 进入时,这表示用户已进入对象菜单,因此容器设置了“对象帮助菜单”标志,并使用该标志的状态将 WM_MENUSELECTWM_INITMENUPOPUPWM_COMMAND 等消息至少转发到对象窗口。 (退出时,容器会清除标志,然后处理这些相同的消息本身。容器应使用从对象函数返回的 IOleInPlaceActiveObejct::GetWindow 窗口作为这些消息的目标。

如果对象在 OLEMENUGROUPWIDTHS 的第六个元素中检测到零,则会根据正常的 OLE Documents 规则继续。 此过程涉及一些参与“帮助”菜单合并的容器和一些未参与此合并的容器。

当对象调用 IOleInPlaceFrame::SetMenu时,在显示合并菜单栏之前,容器将检查 帮助 菜单是否具有附加的子菜单,以及容器插入的内容。 如果是这样,容器会将其 帮助 菜单保留在合并菜单栏中。 如果 “帮助 ”菜单没有其他子菜单,容器将从合并菜单栏中删除其 “帮助 ”菜单。 此过程涵盖参与 “帮助 ”菜单合并的对象以及未合并的对象。

最后,当是时候反汇编菜单时,该对象除了删除其他插入的菜单外,还会删除插入的 帮助 菜单。 当容器删除其菜单时,除了已插入的其他菜单外,容器还将删除其 帮助 菜单。

另请参阅

活动文档容器