实现就地激活

就地激活使用户无需离开容器文档即可与嵌入对象交互。 当用户激活对象时,由容器应用程序和服务器应用程序的菜单栏中的元素组成的复合菜单栏将替换容器的主菜单栏。 因此,这两个应用程序中的命令和功能都可供用户使用,包括活动对象的上下文相关帮助。 当用户开始使用文档的某些非对象部分时,将停用该对象,从而导致容器文档的原始菜单替换复合菜单。

此功能最初按就地编辑的名称执行。 该名称已更改,因为编辑只是用户与正在运行的对象交互的一种方式。 例如,声音剪辑可以收听,而不是编辑。 视频剪辑可以查看,而不是编辑。 就地激活尤其适用于视频剪辑,因为此功能允许视频剪辑就地运行,而无需调用单独的窗口。 如果视频要与容器文档中的相邻文本数据一起查看,这可能至关重要。

对于容器和服务器应用程序,实现就地激活是严格的可选操作。 OLE 仍然支持激活对象会导致服务器应用程序打开单独窗口的模型。 链接的对象始终在单独的窗口中打开,以强调其驻留在单独的文档中。

就地激活始于从容器进行 IOleObject::DoVerb 调用的对象。 此调用通常在用户双击对象或从容器应用程序的“编辑”菜单中选择命令(谓词)时发生。

就地窗口在嵌入对象处于活动状态时接收键盘和鼠标输入。 当用户从复合菜单栏中选择命令时,命令和关联的菜单消息将发送到容器或对象应用程序,具体取决于所选的特定下拉菜单。 通过对象的标尺、工具栏或框架装饰方式输入可直接转到具有这些窗口的嵌入对象。

就地激活的嵌入对象会始终保持活动状态,直到容器停用对象以响应用户输入或该对象自愿放弃活动状态,例如视频剪辑。 用户可以通过在容器文档内部,对象的就地激活窗口外部单击或直接单击另一个对象来停用对象。 但是,如果用户单击容器的标题栏、滚动条,特别是菜单栏,就地激活的对象将保持活动状态。

可以将就地激活对象服务器作为进程内服务器 (DLL) 或本地服务器 (EXE) 实现。 在这两种情况下,复合菜单栏包含服务器和容器进程中的项(通常是下拉菜单)。 对于进程内服务器,就地激活窗口只是容器窗口层次结构中的另一个子窗口,通过容器应用程序的消息泵接收其输入。

对于本地服务器,就地激活窗口属于嵌入对象的服务器应用程序进程,但其父窗口属于容器。 就地激活窗口的输入显示在服务器的消息队列中,并由服务器的消息循环调度。 OLE 库负责查看菜单命令和消息调度是否正确。

复合文档