主要接口用于取消管理是 IOleUndoManager,由环境实现。 若要支持取消管理,单独的实现抵消单位 (即 IOleUndoUnit,可以包含多个单独的步骤。
如何实现取消管理取决于是否编辑器支持多个视图。 每个实现的程序在下一节详细描述。
用例编辑支持单个视图的位置
在此方案中,编辑器不支持多视图。 只有一个编辑器,另一个用于文档,并且,它们支持取消。 使用以下过程实现取消管理。
若要支持取消单视图编辑器的管理
调用 IServiceProvider 接口的 QueryInterface 在 IOleUndoManager的窗口框架组成,通常从文档视图对象访问取消管理器 (IID_IOLEUndoManager)。
在视图放置到窗架时,它会获取该站点指针,它可以使用调用 IServiceProvider的 QueryInterface 。
用例编辑支持多个视图的位置
如果您有文档和视图分开,则通常有一个取消管理器与文档。 所有在一个抵消单位放置取消管理器与文档数据对象。
而不是查询移除管理器的视图中,的每个视图的文档时,数据对象调用 CreateInstance 实例化取消管理器中,指定 CLSID_OLEUndoManager 类标识符。 类标识符在 OCUNDOID.h 文件中定义的。
当使用 CreateInstance 创建时自己取消管理器实例,请使用下面的过程将取消管理器到环境。
将取消管理器到环境
调用从 IID_IOleUndoManager的 ILocalRegistry2 返回的对象的 QueryInterface 。 存储指向 IOleUndoManager。
调用 IOleUndoManager 的 QueryInterfaceIID_IOleCommandTarget的。 存储指向 IOleCommandTarget。
出现 QueryStatus 和 Exec 调入存储的 IOleCommandTarget 下面 StandardCommandSet97 命令的接口:
cmdidUndo
cmdidMultiLevelUndo
cmdidRedo
cmdidMultiLevelRedo
cmdidMultiLevelUndoList
cmdidMultiLevelRedoList
调用 IOleUndoManager 的 QueryInterfaceIID_IVsChangeTrackingUndoManager的。 存储指向 IVsChangeTrackingUndoManager。
使用指针 IVsChangeTrackingUndoManager 调用 MarkCleanState、 AdviseTrackingClient和 UnadviseTrackingClient 方法。
调用 IOleUndoManager 的 QueryInterfaceIID_IVsLinkCapableUndoManager的。
调用与文档的 AdviseLinkedUndoClient ,还应实现 IVsLinkedUndoClient 接口。 关闭文档后,请调用 IVsLinkCapableUndoManager::UnadviseLinkedUndoClient。
关闭文档后,调用在撤消管理器的 QueryInterfaceIID_IVsLifetimeControlledObject的。
当更改文档时,调用管理器的 Add 具有 OleUndoUnit 类的。 Add 方法保持对对象,因此您通常释放它在 Add之后。
OleUndoManager 类表示单个撤消堆栈实例。 因此,具有移除对象每个数据实体跟踪提供取消的经理或重做操作。
备注
在文本编辑器中广泛使用取消管理器对象,它是没有特定于文本编辑器支持的泛型元素。如果要支持多级撤消或重做操作,您可以使用此对象来实现。