实现In-Place激活

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

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

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

就地激活以对象开头,以响应其容器中的 IOleObject::D oVerb 调用。 此调用通常在响应用户双击对象时发生,或者从容器应用程序的“编辑”菜单中选择 (谓词) 命令。

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

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

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

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

复合文档