Форум: "Основная";
Текущий архив: 2004.02.10;
Скачать: [xml.tar.bz2];
ВнизРисование Найти похожие ветки
← →
Evgeny78 (2004-01-30 13:35) [0]Как можно отменить нарисованный рисунок (линия, круг) на Image.
← →
MBo (2004-01-30 13:37) [1]Никак, только стереть
← →
Reindeer Moss Eater (2004-01-30 13:37) [2]Нарисовать его еще раз с другими цветами или флагами
← →
AKul (2004-01-30 13:59) [3]
> Evgeny78 (30.01.04 13:35)
Отменить никак - только восстановалением ранее сохраненного Image"а.
P.S. Можно вспомнить еще о функции XOR, и что произойдет, если два раза вывести одно и то же (через XOR).
← →
Goida (2004-01-30 14:44) [4]XOR не подходит для разноцветных изображений. Т.е. подходит, но при перетаскивании линии (как в Paint) будет не очень приятный эффект. Остается только > только восстановаление ранее сохраненного Image"а. Для предотвращения моргания можно поставить у формы, при создании, в TRUE значение свойства DoublBuffer.
← →
AKul (2004-01-30 14:47) [5]
> Goida © (30.01.04 14:44) [4]
> XOR не подходит для разноцветных изображений.
Почему это?
Кроме того, нарисованную через XOR, например, линию будет видно на любом фоне.
← →
AKul (2004-01-30 14:51) [6]В общем, [5] это вопрос к автору.
Если надо организовать что-то типа Undo - то через сохранение.
Если же надо, что-то типа выделения (перетаскивания на фоне) - тогда XOR/
← →
Goida (2004-01-30 14:56) [7]
> AKul © (30.01.04 14:47) [5]
> Почему это?
Тебе просто понравился твой результат работы, когда ты зделал свой Paint. А мне - нет. Почему? Представь только, у тебя задний фон представляет собой сто линий разного цвета и в разном напрвлении (месиво такое). Теперь попробуй нарисовать линию, скажем зеленую, и ты увидишь, что при перетаскивании она пропадает в местах пересечения с линиями такого же цвета и менят - другого. Мне это не понравилось.
← →
Goida (2004-01-30 14:57) [8]
> (перетаскивания на фоне) - тогда XOR/
Как раз и не подходит. Потому - я уже объяснил.
← →
AKul (2004-01-30 15:30) [9]
> Goida © (30.01.04 14:57) [8]
>
> Как раз и не подходит. Потому - я уже объяснил.
Это тебе так хочется.
Во-первых, как раз на этом "месиве" линию, нарисованную через XOR, будет видно в любом случае. Кроме того, если "месиво" из этих линий близко к зеленому, и ты нарисуешь зеленую поверх, как ты думаешь, легко ли ее будет потом найти.
Во-вторых, если надо выделить рамкой/перетащить какой-то объект, то для этого как раз больше всего подходит вывод через XOR (если ты непонял, то повторное перерисование восстанавливает фон). Или ты думаешь, что выделение рамкой в других программах организовано через буфер, через который информация доложна восстанавливаться и записываться при каждом перемещении мыши (зачем такие затраты?)? Вывод через XOR никакого буфера не требует.
Что-бы убедиться в мною сказанном, открой Delphi, создай форму, кинь пару компонент, сделай их черными. А теперь начни выделять их мышкой так, чтобы рамка зашла на "черный" цвет. Странно, не правда ли, разработчики IDE сочли, что вывод через XOR почему-то подходит для выделения! А представь, что бы ты делал, если бы на черных компонентах рамка выделения оставалась черной? А как ты думаешь, нравилось бы это пользователям, рисующим, скажем, в Paint"е?
В третий раз повторюсь:
Если надо организовать что-то типа Undo - то через сохранение.
Если же надо, что-то типа выделения (перетаскивания на фоне) - тогда XOR.
← →
Тимохов (2004-01-30 15:43) [10]Я вот подумал, а нельзя ли такое реализовать через метафайлы.
С метафайлами работал много (для предпросмотра печати), но никогда глубоко их не копал. Может там можно отмену чего-нить делать?
← →
MBo (2004-01-30 15:48) [11]>Тимохов
Да, вполне.
Метафайл - последовательность команд, и при проигрывании его в контекст можно выводить не все записи.
← →
Тимохов (2004-01-30 15:57) [12]
> Метафайл - последовательность команд, и при проигрывании
> его в контекст можно выводить не все записи.
Да? Ну я в общем - то так и думал, т.к. там не может быть ничего, кроме последовательности команд.
Почитать про это можно в MSDN или дополнительные источники нужно смотреть?
← →
Goida (2004-01-30 16:10) [13]
> AKul
Ты меня не слушаешь. Через XOR можно, но глупо, если это цветное изображение и тебе важно передовать цвет при перетаскивании. А в другом случает - пожалуйста: самый простой способ, с этим не спорю.
Ты AKul просто попробуй на досуге сделать Paint один-в-один с MS"овским и ты поймешь, что я имею ввиду.
← →
MBo (2004-01-30 16:23) [14]>Почитать про это можно в MSDN или дополнительные источники нужно смотреть?
Да, в MSDN (хотя по этому поводу там не больше,чем в дельф. хелпе), и книга Фень Юаня.
← →
AKul (2004-01-30 17:03) [15]
> Goida © (30.01.04 16:10) [13]
> Ты меня не слушаешь
Да нет уж, это попросту ты не понимаешь, в каких случаях оптимально использовать вывод через XOR, а в каких - перерисовку.
Для начала поиграйся с рамкой выделения (это такой пунктирный прямоугольник, если ты еще не понял, который появляется, например, в IDE Delphi, когда ты на форме (при разработке) удерживая кнопку мыши, двигаешь мышь). Заметь, что ее видно на любом фоне, т.е. если фон черный - она становится белой. Подумай, зачем так сделано. Кстати, можешь посмотреть булеву алгебру (если ты до сих пор не знал, что повторный XOR восстанавливает число).
Наигравшись с рамкой выделения, можешь попробовать написать мааааленькую програмку для рисования линий мышкой, нажимается кнопка мышки - это есть начало линии. Пока кнопка нажата, должна проводиться линия от начальной точки до курсора мышки, само собой при перемещении курсора, предыдущая линия должна стираться и проводиться новая (может автор как раз это и хотел?). Так вот, повторное рисование линии на том же месте (опять же через XOR), если конечно фон не менялся, восстановит фон без малейших дополнительных операций и без моргания.
Перерисование (прямой вывод) имеет смысл в том случае, если необходимо перемещать полноцветный рисунок не искажая оригинальных цветов.
Но автор вопроса спросил как можно стересь нарисованную линию или круг (не полноцветный рисунок). Больше уточнений никаких не было.
Если же автору надо сделать что-то типа операции Undo, то (в 4 раз говорю) пусть восстанавливает раннее сохраненное изображение.
Или же воспользуется советом Тимохова © [10].
← →
Goida (2004-01-30 17:41) [16]> AKul
Прости. Я вообще не пытался усомниться в твоих знаниях.
> если фон черный - она становится белой
А если меняется? XOR - на мусорку. Иначе линия будет полосатой.
> если конечно фон не менялся
В этом случае и не уместно использовать XOR.
Я же говорил, если просто выделять - подходит. Но для того, чтобы цвет перетаскиваемой линии не зависел от фона - нет.
Вот и все, что я пытался сказать.
← →
AKul (2004-01-30 17:59) [17]
> Goida © (30.01.04 17:41) [16]
> Прости. Я вообще не пытался усомниться в твоих знаниях.
Причем тут это?
> А если меняется? XOR - на мусорку. Иначе линия будет полосатой.
Ты хоть понимаешь о чем здесь речь? Видимо нет.
Если у тебя несколько параллельных полос разных цветов (в том числе и цвет рамки выделения или рисуемой мышкой линии). Как тогда подобрать цвет рамки (линии), ведь пользователь может ее провести как вдоль одной, так и поперек всех? Сканировать все изображение? - не оптимально. Вот поэтому и используется вывод через XOR.
> В этом случае и не уместно использовать XOR.
Зачем что-то рисовать в том месте, где пользователь в данный момент рисует линию?
Если же все-таки непонятно каким образом такое возникло (каким?), то после восстановления фона (WM_PAINT) достаточно заново нарисовать линию через XOR (Программа в любом случае же будет знать об изменении фона). После чего все пойдет своим чередом...
← →
Goida (2004-01-30 18:07) [18]
> AKul
Слушай, мы не разберемся без примера. Дай мне своё мыло и через некоторое время я пришлю пример с разъяснением.
ЗЫ: я знаю как работает XOR. Не волнуйся так.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.02.10;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.007 c