Практическое руководство. Реализация управления отменой
Основной интерфейс, используемый для управления отката IOleUndoManager, который реализован средой. Для поддержки управления отката, реализуйте отдельные единицы отката (т е IOleUndoUnit, который может содержать несколько отдельных шагов.
Способ реализации элемента управления отката, зависит от того, поддерживает ли данный редактор несколько представлений или нет. Процедуры для каждой реализации детализированы в следующих разделах.
Случаи, когда редактор поддерживает одно представление
В этом сценарии редактор не поддерживает несколько представлений. Только один редактора и один документ, и они поддерживают откат. Используйте следующую процедуру для реализации управление отката.
Rollback для поддержки управления редактора единый-вида
Вызов QueryInterface на IServiceProvider интерфейс на границе окна IOleUndoManagerиз объекта представления документа, чтобы открыть диспетчер отката (IID_IOLEUndoManager).
Если представление находится в границы окна, оно получает указатель сайта, оно может использовать для вызова QueryInterface для IServiceProvider.
Случаи, когда редактор поддерживает несколько представлений
Если существует документ и разделение представления, то обычно один диспетчер отката, связанный с документом. Все единицы отката размещаются на одном диспетчере отката, связанном с объектом данных документа.
Вместо представления при запросе диспетчера отката, что по одному для каждого представления вызовы объекта данных документа CreateInstance создать диспетчер отката, указав идентификатор класса CLSID_OLEUndoManager. Идентификатор класса определен в файле OCUNDOID.h.
При использовании CreateInstance чтобы создать собственный экземпляр диспетчера отката, используйте следующую процедуру в обработчик в диспетчер отката среды.
Пользовательский диспетчер отката в обработчик среды
Вызов QueryInterface в объекте, возвращенном из ILocalRegistry2 для IID_IOleUndoManager. Сохраните указатель на IOleUndoManager.
Вызов QueryInterface на IOleUndoManager для IID_IOleCommandTarget. Сохраните указатель на IOleCommandTarget.
Relay ваше Exec и IOleCommandTarget вызывает, которые хранят QueryStatus интерфейс для следующих команд StandardCommandSet97:
cmdidUndo
cmdidMultiLevelUndo
cmdidRedo
cmdidMultiLevelRedo
cmdidMultiLevelUndoList
cmdidMultiLevelRedoList
Вызов QueryInterface на IOleUndoManager для IID_IVsChangeTrackingUndoManager. Сохраните указатель на IVsChangeTrackingUndoManager.
Используйте указатель на AdviseTrackingClientвызов UnadviseTrackingClient " IVsChangeTrackingUndoManager и MarkCleanStateметоды.
Вызов QueryInterface на IOleUndoManager для IID_IVsLinkCapableUndoManager.
Вызов AdviseLinkedUndoClient вместе с документом, который также должен реализовать IVsLinkedUndoClient интерфейс. Если документ закрыт, вызовите IVsLinkCapableUndoManager::UnadviseLinkedUndoClient.
Если документ закрыт, вызовите QueryInterface в диспетчере отката для IID_IVsLifetimeControlledObject.
Вызов метода SeverReferencesToOwner.
При внесении изменений в документе, вызовите Add в диспетчере с OleUndoUnit класс. Add метод хранит ссылку на объект, поэтому, как правило, она сразу после выпуска Add.
OleUndoManager класс представляет отдельный экземпляр стек отката. Таким образом, один объект диспетчера отката в сущность данных, отслеживанными для отката или повтора.
Примечание
Пока объект диспетчера отката широко используется текстовым редактором, общий компонент, который не имеет конкретную поддержку текстового редактора.Если требуется поддерживать многоуровневые отката или повтора, то можно использовать этот объект.
См. также
Задачи
Практическое руководство. Очистка стек отката