IOleParentUndoUnit 接口 (ocidl.h)

允许撤消单位包含子撤消单位。 例如,即使涉及多个单独的操作,也可以将复杂操作作为单个撤消操作呈现给最终用户。 所有从属撤消操作都包含在顶级父撤消单元中。

最初使用 IOleUndoManager::Open 方法创建父撤消单元。 应始终通过撤消管理器添加撤消单元。 父单元上的 IOleParentUndoUnit::OpenIOleParentUndoUnit::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 并检查被阻止或禁用的打开父级。 如果存在任何一个,则无需创建新的父级。 否则,对象会创建父级并在堆栈上打开它。
如果同时设置了UAS_NOPARENTENABLE和UAS_BLOCKED标志,则应使用与调用方最相关的标志,UAS_NOPARENTENABLE优先。 例如,如果对象正在创建简单的撤消单元,它应注意UAS_NOPARENTENABLE标志并清除撤消堆栈。 如果它正在创建启用父单元,则它应注意UAS_BLOCKED标志并跳过创建。

当父撤消单元标记为“已阻止”时,它会放弃它接收的任何撤消单位。

继承

IOleParentUndoUnit 接口继承自 IOleUndoUnitIOleParentUndoUnit 也有以下类型的成员:

方法

IOleParentUndoUnit 接口具有这些方法。

 
IOleParentUndoUnit::Add

将简单的撤消单元添加到集合。
IOleParentUndoUnit::Close

关闭指定的父撤消单元。 (IOleParentUndoUnit.Close)
IOleParentUndoUnit::FindUnit

指示指定的单位是此撤消单元的子单元还是其子级之一,即指定单位是否为此父单元中的层次结构的一部分。
IOleParentUndoUnit::GetParentState

检索有关最内部打开的父撤消单元的状态信息。 (IOleParentUndoUnit.GetParentState)
IOleParentUndoUnit::Open

打开一个新的父撤消单元,该单元成为包含单元的撤消堆栈的一部分。

要求

要求
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
目标平台 Windows
标头 ocidl.h

另请参阅

IOleUndoManager

IOleUndoUnit