菜单和资源:菜单合并
本文详细介绍了 OLE 文档应用程序正确处理可视化编辑和就地激活所需的步骤。 就地激活给容器和服务器(组件)应用程序都带来了挑战。 用户仍然在同一个框架窗口中(在容器文档的上下文内),但实际上正在运行另一个应用程序(服务器)。 这需要在容器和服务器应用程序的资源之间进行协调。
本文涉及的主题包括:
菜单布局
第一步是协调菜单布局。 容器应用程序应创建一个新菜单,仅在嵌入项已就地激活时使用。 该菜单至少应包含以下内容(按所列顺序):
文件菜单与打开文件时使用的文件菜单相同。 (通常不会在下一个菜单项之前放置其他菜单项。)
两个连续分隔符。
窗口菜单与打开文件时使用的菜单相同(仅当容器应用程序位于 MDI 应用程序中时)。 某些应用程序可能具有属于该组的其他菜单,例如选项菜单,当嵌入式项被激活时,该菜单仍保留在菜单上。
注意
可能存在影响容器文档视图的其他菜单,例如 Zoom。 这些容器菜单在此菜单资源中的两个分隔符之间显示。
服务器(组件)应用程序还应该创建一个专门用于就地激活的新菜单。 它应该与打开文件时使用的菜单类似,但不包含菜单项,例如操作服务器文档而不是数据的“文件”和“窗口”。 通常,此菜单包括以下内容:
编辑菜单与打开文件时使用的菜单相同。
分隔符。
对象编辑菜单,如 Scribble 示例应用程序中的“笔”菜单。
分隔符。
“帮助”菜单。
有关示例,请查看容器和服务器的一些示例就地菜单的布局。 已删除每个菜单项的详细信息,使示例更加清晰。 容器的就地菜单具有以下条目:
IDR_CONTAINERTYPE_CNTR_IP MENU PRELOAD DISCARDABLE
BEGIN
POPUP "&File C1"
MENUITEM SEPARATOR
POPUP "&Zoom C2"
MENUITEM SEPARATOR
POPUP "&Options C3"
POPUP "&Window C3"
END
连续分隔符指示服务器菜单的第一部分位于何处。 现在请查看服务器的就地菜单:
IDR_SERVERTYPE_SRVR_IP MENU PRELOAD DISCARDABLE
BEGIN
POPUP "&Edit S1"
MENUITEM SEPARATOR
POPUP "&Format S2"
MENUITEM SEPARATOR
POPUP "&Help S3"
END
此处的分隔符指示第二组容器菜单项的位置。 当来自此服务器的对象在此容器内就地激活时,生成的菜单结构如下所示:
BEGIN
POPUP "&File C1"
POPUP "&Edit S1"
POPUP "&Zoom C2"
POPUP "&Format S2"
POPUP "&Options C3
POPUP "&Window C3"
POPUP "&Help S3"
END
如你所见,分隔符已替换为每个应用程序菜单的不同组。
与就地菜单关联的加速器表也应该由服务器应用程序提供。 容器会将它们合并到自己的加速器表中。
当某个嵌入项就地激活时,框架将加载就地菜单。 然后,它会请求服务器应用程序提供就地激活的菜单,并将其插入分隔符所在的位置。 这便是菜单组合的方式。 从容器中获取用于操作文件和窗口放置的菜单,并从服务器获取用于操作项的菜单。
工具栏和状态栏
服务器应用程序应创建新的工具栏并将其位图存储在单独的文件中。 应用程序向导生成的应用程序将此位图存储在一个名为 ITOOLBAR.BMP 的文件中。 当服务器的项就地激活时,新的工具栏将替换容器应用程序的工具栏,并且应包含与普通工具栏相同的项,但删除表示“文件”和“窗口”菜单上的项的图标。
此工具栏加载到你的 COleIPFrameWnd
派生类中,由应用程序向导为你创建。 此状态栏由容器应用程序处理。 有关就地框架窗口实现的详细信息,请参阅服务器:实现服务器。