IOleParentUndoUnit 接口 (ocidl.h)
允许撤消单位包含子撤消单位。 例如,即使涉及多个单独的操作,也可以将复杂操作作为单个撤消操作呈现给最终用户。 所有从属撤消操作都包含在顶级父撤消单元中。
最初使用 IOleUndoManager::Open 方法创建父撤消单元。 应始终通过撤消管理器添加撤消单元。 父单元上的 IOleParentUndoUnit::Open 和 IOleParentUndoUnit::Close 方法最终将由撤消管理器调用。 让父单元回调到撤消管理器将导致无限递归。
当父单元处于打开状态时,撤消管理器通过调用 IOleParentUndoUnit::Add 向其添加撤消单位。 当撤消管理器关闭顶级父级时,整个撤消单元及其嵌套的从属关系将放在撤消堆栈的顶部。
在添加任何其他撤消单元之前,需要在堆栈上打开启用父级。 如果一个未打开,应改为清除堆栈。 这是为了确保撤消单位仅作为用户操作而添加,而不是编程操作的结果。 例如,如果应用程序希望撤消单击某个按钮,但该操作也会通过对象模型公开。 该操作应可通过用户界面撤消,但不能通过对象模型撤消,因为无法还原用户脚本代码的状态。 由于同一代码在这两种情况下实现更改,因此处理按钮单击的 UI 代码应打开堆栈上的启用父级,调用相应的代码,然后关闭父单元。 对象模型代码不会打开父单元,导致撤消堆栈被清除。
如果不希望代码调用其他代码,而你知道这些代码可能会尝试将撤消单元添加到堆栈中,则使用阻止父级。 例如,如果调用创建撤消单元的代码,而外部代码已创建将完全撤消所有所需行为的代码,则应使用阻止父级。
触发事件以响应用户操作时,将使用非启用父级。 仅当事件处理程序执行尝试创建撤消单元的操作时,才会清除堆栈,但如果不存在任何处理程序,则将保留撤消堆栈。
如果对象需要创建父单元,请考虑以下几种情况:
- 若要创建启用父单元,对象在撤消管理器上调用 IOleUndoManager::GetOpenParentState 并检查返回值。 如果值为 S_FALSE,则 对象会创建启用父级并将其打开。 如果返回值S_OK,则表示父级已打开。 如果打开的父 (UAS_BLOCKED 位集) 被阻止,或者启用父 (UAS_BLOCKED,UAS_NOPARENTENABLE位未) 设置,则无需创建启用父级。 如果当前打开的父级是禁用父 (UAS_NOPARENTENABLE 位集) ,则应创建并打开启用父级以重新启用添加撤消单位。 请注意,UAS_NORMAL的值为零,这意味着它不包含所有其他位,并且不是可以设置的位标志。 如果将 *pdwState 与 UAS_NORMAL 进行比较,请使用 UAS_MASK 屏蔽 pdwState 中未使用的位,以便将来进行扩展。
- 为了创建被阻止的父级,对象调用 IOleUndoManager::GetOpenParentState 并检查已阻止的打开父级。 如果存在,则无需创建新的阻止父级。 否则,对象会创建它并在堆栈上打开它。
- 为了创建禁用父级,对象调用 IOleUndoManager::GetOpenParentState 并检查被阻止或禁用的打开父级。 如果存在任何一个,则无需创建新的父级。 否则,对象会创建父级并在堆栈上打开它。
当父撤消单元标记为“已阻止”时,它会放弃它接收的任何撤消单位。
继承
IOleParentUndoUnit 接口继承自 IOleUndoUnit。 IOleParentUndoUnit 也有以下类型的成员:
方法
IOleParentUndoUnit 接口具有这些方法。
IOleParentUndoUnit::Add 将简单的撤消单元添加到集合。 |
IOleParentUndoUnit::Close 关闭指定的父撤消单元。 (IOleParentUndoUnit.Close) |
IOleParentUndoUnit::FindUnit 指示指定的单位是此撤消单元的子单元还是其子级之一,即指定单位是否为此父单元中的层次结构的一部分。 |
IOleParentUndoUnit::GetParentState 检索有关最内部打开的父撤消单元的状态信息。 (IOleParentUndoUnit.GetParentState) |
IOleParentUndoUnit::Open 打开一个新的父撤消单元,该单元成为包含单元的撤消堆栈的一部分。 |
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows 2000 Professional [仅限桌面应用] |
最低受支持的服务器 | Windows 2000 Server [仅限桌面应用] |
目标平台 | Windows |
标头 | ocidl.h |