菜单和资源:菜单合并

本文详细介绍了 OLE 文档应用程序正确处理视觉编辑和就地激活所需的步骤。 就地激活对容器和服务器(组件)应用程序构成挑战。 用户保留在同一帧窗口中(在容器文档的上下文中),但实际上正在运行另一个应用程序(服务器)。 这需要在容器和服务器应用程序的资源之间进行协调。

本文中介绍的主题包括:

菜单布局

第一步是协调菜单布局。 容器应用程序应创建一个新菜单,以便仅在嵌入项就地激活时使用。 至少,此菜单应按列出的顺序包含以下各项:

  1. 文件菜单与打开文件时使用的文件菜单相同。 (通常没有其他菜单项放在下一项之前。

  2. 两个连续分隔符。

  3. 窗口菜单与打开文件时使用的窗口菜单相同(仅当 MDI 应用程序中的容器应用程序时)。 某些应用程序可能有其他菜单(例如属于此组的“选项”菜单),当嵌入项就地激活时,该菜单将保留在菜单上。

    注释

    可能存在影响容器文档视图的其他菜单,例如 Zoom。 这些容器菜单在此菜单资源中的两个分隔符之间显示。

服务器(组件)应用程序还应创建新的菜单,专门用于就地激活。 它应该与打开文件时使用的菜单类似,但不使用菜单项,例如作服务器文档而不是数据的文件和窗口。 通常,此菜单包括以下内容:

  1. 编辑菜单与打开文件时使用的菜单相同。

  2. 分隔符。

  3. 对象编辑菜单,如 Scribble 示例应用程序中的触控笔菜单。

  4. 分隔符。

  5. 帮助菜单。

有关示例,请查看容器和服务器的一些示例就地菜单的布局。 已删除每个菜单项的详细信息,使示例更加清晰。 容器的就地菜单具有以下条目:

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

另请参阅

菜单和资源 (OLE)
激活
服务器
容器