Отменить для программы рисования

Я изучаю, как написать программу рисования, которая поддерживает отмену, и вижу, что, скорее всего, мне нужен шаблон команды. Однако кое-что все еще ускользает от меня, и я надеюсь, что кто-то сможет дать простой ответ или подтверждение.

По сути, если я должен реализовать возможность отмены команды, например, отметив сплошной кружок на экране, это сделает Значит, мне нужно скопировать буфер кадра, который охватывает круг, в память, в этот командный объект? Я не вижу другого способа отменить то, что могло бы быть, например, нанесением штампа на кучу случайных цветов пикселей.

Я слышал, что один из подходов - просто отслеживать действия вперед и когда выполняется отмена, вы просто начинаете с шага 1 и переходите к шагу до отмены, но это кажется невыполнимым, если вы хотите поддерживать большой стек отмены.

Возможно, решение - что-то среднее между тем, где вы сохраняете битовую карту каждых 15-20 действий и начинаете с последнего «сохранения» вперед.

Может кто-нибудь предоставить какое-либо представление о типичном принятом подходе в этом случае, будь то сохранение прямоугольников буфера в командах, повторение каждого действия вперед или что-то, что я вообще пропустил?

Обновление: много хороших ответов. Спасибо всем. Из того, что я читаю, я думаю, что подойду к этому, сохраняя буфер каждые N действий, и когда пользователь выдает команду отмены, повторите все команды из самого последнего сохраненного буфера. Я могу настроить N на максимально возможное значение, которое не сильно мешает пользователю быстро реагировать на отмену (чтобы минимизировать использование памяти), но я подозреваю, не зная на данный момент наверняка, что я смогу обойтись без выполнения нескольких действий в одном кадре, так что это не так уж плохо. Надеюсь, этот подход позволит мне быстро определить, следует ли повернуть в другую сторону и вместо этого сохранить растровые изображения для предыдущих состояний для действий, которые этого требуют.

15
задан Joey 15 October 2010 в 19:41
поделиться