本文详细介绍了 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
由应用程序向导创建的 -derived 类中。 状态栏由容器应用程序处理。 有关就地框架窗口实现的详细信息,请参阅 “服务器:实现服务器”。