如何:实现取消管理

主要接口用于取消管理是 IOleUndoManager,由环境实现。 若要支持取消管理,单独的实现抵消单位 (即 IOleUndoUnit,可以包含多个单独的步骤。

如何实现取消管理取决于是否编辑器支持多个视图。 每个实现的程序在下一节详细描述。

用例编辑支持单个视图的位置

在此方案中,编辑器不支持多视图。 只有一个编辑器,另一个用于文档,并且,它们支持取消。 使用以下过程实现取消管理。

若要支持取消单视图编辑器的管理

  1. 调用 IServiceProvider 接口的 QueryInterfaceIOleUndoManager的窗口框架组成,通常从文档视图对象访问取消管理器 (IID_IOLEUndoManager)。

  2. 在视图放置到窗架时,它会获取该站点指针,它可以使用调用 IServiceProviderQueryInterface

用例编辑支持多个视图的位置

如果您有文档和视图分开,则通常有一个取消管理器与文档。 所有在一个抵消单位放置取消管理器与文档数据对象。

而不是查询移除管理器的视图中,的每个视图的文档时,数据对象调用 CreateInstance 实例化取消管理器中,指定 CLSID_OLEUndoManager 类标识符。 类标识符在 OCUNDOID.h 文件中定义的。

当使用 CreateInstance 创建时自己取消管理器实例,请使用下面的过程将取消管理器到环境。

将取消管理器到环境

  1. 调用从 IID_IOleUndoManager的 ILocalRegistry2 返回的对象的 QueryInterface 。 存储指向 IOleUndoManager

  2. 调用 IOleUndoManagerQueryInterfaceIID_IOleCommandTarget的。 存储指向 IOleCommandTarget

  3. 出现 QueryStatusExec 调入存储的 IOleCommandTarget 下面 StandardCommandSet97 命令的接口:

    • cmdidUndo

    • cmdidMultiLevelUndo

    • cmdidRedo

    • cmdidMultiLevelRedo

    • cmdidMultiLevelUndoList

    • cmdidMultiLevelRedoList

  4. 调用 IOleUndoManagerQueryInterfaceIID_IVsChangeTrackingUndoManager的。 存储指向 IVsChangeTrackingUndoManager

    使用指针 IVsChangeTrackingUndoManager 调用 MarkCleanStateAdviseTrackingClientUnadviseTrackingClient 方法。

  5. 调用 IOleUndoManagerQueryInterfaceIID_IVsLinkCapableUndoManager的。

  6. 调用与文档的 AdviseLinkedUndoClient ,还应实现 IVsLinkedUndoClient 接口。 关闭文档后,请调用 IVsLinkCapableUndoManager::UnadviseLinkedUndoClient

  7. 关闭文档后,调用在撤消管理器的 QueryInterfaceIID_IVsLifetimeControlledObject的。

  8. 调用 SeverReferencesToOwner

  9. 当更改文档时,调用管理器的 Add 具有 OleUndoUnit 类的。 Add 方法保持对对象,因此您通常释放它在 Add之后。

OleUndoManager 类表示单个撤消堆栈实例。 因此,具有移除对象每个数据实体跟踪提供取消的经理或重做操作。

备注

在文本编辑器中广泛使用取消管理器对象,它是没有特定于文本编辑器支持的泛型元素。如果要支持多级撤消或重做操作,您可以使用此对象来实现。

请参见

任务

如何:清除撤消堆栈

参考

IVsChangeTrackingUndoManager

IVsLifetimeControlledObject