帮助菜单合并

当某个对象在容器中处于活动状态时,OLE 文档的菜单合并协议将向该对象提供对“帮助”菜单的完全控制权。 因此,容器的帮助主题将不可用,除非用户停用该对象。 活动文档包容体系结构基于就地菜单合并的规则进行扩展,以允许容器和活动文档共享此菜单。 新规则是一些有关哪些组件拥有菜单的哪个部分以及如何构造共享菜单的额外约定。

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

Help

Container Help >

Object Help >

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

Help

Binder Help >

Word Help >

这两个菜单项都是级联菜单,其下方是特定于容器的任何附加菜单项和提供给用户的对象。 此处显示的项随容器和包含的对象而异。

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

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

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

然后,此对象会将 OLEMENUGROUPWIDTHS 的第六个元素设置为 0,并将第五个元素递增 1。 这可让 OLE 获知“帮助”菜单属于容器,并且与此菜单(及其子菜单)对应的菜单消息应传送到该容器。 然后,容器负责转发 WM_INITMENUPOPUP、WM_SELECT、WM_COMMAND 以及属于对象的“帮助”菜单的一部分的其他与菜单相关的消息。 此操作通过使用 WM_INITMENU 完成以清除标志,此标志告知容器用户是否已导航到对象的“帮助”菜单。 然后,容器将监视 WM_MENUSELECT 以了解是否有条目进入或退出容器未自行添加的“帮助”菜单中的任何项。 进入时,意味着用户已导航到某个对象菜单,因此容器会设置“in object Help menu”标志,并使用此标志的状态将任何 WM_MENUSELECT、WM_INITMENUPOPUP 和 WM_COMMAND 消息(作为最低要求)转发到对象窗口。 (在退出时,容器将清除此标志,然后自行处理这些相同的消息。)容器应将从对象的 IOleInPlaceActiveObejct::GetWindow 函数返回的窗口用作这些消息的目标。

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

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

最后,在开始反汇编菜单时,此对象除了删除其他插入的菜单之外,还会删除插入的“帮助”菜单。 当容器删除其菜单时,它除了删除自行插入的其他菜单之外,还将删除其“帮助”菜单。

另请参阅

活动文档容器