Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 778

/ вопрос решён /

Уважаемые эксперты!Я делая графический редактор.Мне надо сделать еще 2 инструмента карандаш и ведёрко (заливка) как это осуществтиь и если можно то пришлите исходник.

Аксион Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Аксион (статус: 4-ый класс)
Вопрос отправлен: 23 июля 2007, 14:04
Состояние вопроса: решён, ответов: 4.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Матвеев Мефодий Олегович!
Сделать карандаш просто. Наиболее просто способ в MouseMove проверять нажата ли клавиша мыши и если да, то рисуем точку в координатах мыши. Где то так
if ssleft in Shift then Canvas.Pixels[x,y]:=clBlack;
Но есть недостаток у этого способа. Если мышь быстро провести, то будет не линия... (попробуйте сами)
можно сделать более хитро.
заводим глобальные переменную

var isMouseDown:boolean;
теперь пишем обработчик нажатия мыши для формы или на чём вы там рисуете
procedure MouseDown.....
begin
  Isdown:=true;
  Canvas.MoveTo(x,y);
Обработчик перемещения мыши
procedure MouseMove.....
begin
  if Isdown then
  Canvas.LineTo(x,y);
и отпускания
procedure MousUp.....
begin
  Isdown:=False;

Для организации заливки достаточно воспользоваться функцией
Canvas.FloodFill(x,y,color,стиль)
стили есть такие
fsSurface
fsBorder
Они определяют, как именно будет заливаться область. Читайте справку и/или эксперементируйте.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 23 июля 2007, 14:16
Оценка за ответ: 5

Комментарий к оценке: Пасибки да и насчёт FloodFill в прошлый раз я так и делал но ничего не вышло, попозже ещё раз попробую

Ответ #2. Отвечает эксперт: Градов Ю.М.

Здравствуйте, Матвеев Мефодий Олегович!
Я оставил Вам исходники двух Paint на http://slil.ru/24656495 около 15 кб

Ответ отправил: Градов Ю.М. (статус: 8-ой класс)
Время отправки: 23 июля 2007, 19:04
Оценка за ответ: 4

Комментарий к оценке: Градов Ю.М. спасибо но ни в том ни в другом примере нет метода FloodFill, а жаль

Ответ #3. Отвечает эксперт: Dron

Здравствуйте, Матвеев Мефодий Олегович!
Заливка делается методом FloodFill() на Canvas. Работает эта вещь немного хитро. Методу передаются 4 параметра: координаты X и Y - точка начала заливки, "опорный" цвет и режим заливки. Опорный цвет - это не цвет заливки, не нужно путать. Режим заливки - fsBorder, либо fsSurface. fsBorder делает заливку до тех пор, пока не найдётся точка с опорным цветом - на ней заливка остановится. fsSurface заливает ту часть, цвет которой совпадает с опорным цветом, т.е. заливка в этом случае останавливается при нахождении любого другого цвета. В графическом редакторе, конечно, нужно использовать fsSurface, т.к. заливается область одного цвета, а какого цвета граница заранее неизвестно. Программа-пример в прикреплённом файле. Удачи!
К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)

Приложение:
  1. procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  2. Shift: TShiftState; X, Y: Integer);
  3. begin
  4. Image1.Canvas.Brush.Color:=ColorBox1.Selected;
  5. Image1.Canvas.Brush.Style:=bsSolid;
  6. Image1.Canvas.FloodFill(X,Y,Canvas.Pixels[X,Y],fsSurface);
  7. end;


Ответ отправил: Dron (статус: Студент)
Время отправки: 23 июля 2007, 20:01
Оценка за ответ: 5

Комментарий к оценке: Нет я болдею ваш пример работает, но когда я написал тогже самое в своём приложении ничего не произошло... опять.... ладно буду разбираться

Ответ #4. Отвечает эксперт: min@y™

Добавлю конкретный примерчик. Писал я 4 года назад одну курсовую подруге... Графредактор. Delphi 6 или 7, уже не помню. Но исходник сохранился. Попробую прицепить к ответу. Там комментарии ПОДРОБНЕЙШИЕ!!
К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 24 июля 2007, 08:16
Оценка за ответ: 5

Комментарий к оценке: Спасибо

Мини-форум вопроса

Всего сообщений: 47; последнее сообщение — 26 июля 2007, 08:16; участников в обсуждении: 4.

Страницы: [1] [2] [3] [Следующая »]

Аксион

Аксион (статус: 4-ый класс), 23 июля 2007, 14:44 [#1]:

Я на счёт более хитрого способа.При этом методе получается инструмент линия а мне надо именно карандаш и насчёт FloodFill про метод этот я знаю а вот как пользоваться нет (я пытался но ничего не получилось.
Аксион

Аксион (статус: 4-ый класс), 23 июля 2007, 14:46 [#2]:

А нет это я намудрил на счёт более хитрого способа я просто не туда вписал :)
Вадим К

Вадим К (статус: Академик), 23 июля 2007, 14:57 [#3]:

вставляем на нажатие кнопки мыши. координаты у нас уже известно. цвет - это ваше дело. а четвёртый параметр - там два варианта. пробуйте.
Галочка "подтверждения прочтения" - вселенское зло.
Аксион

Аксион (статус: 4-ый класс), 23 июля 2007, 19:03 [#4]:

Не работает FloodFill пишу IF FF=33 THEN IMAGE3.Canvas.FloodFill(x,y,label11.Color,fsSurface ); в Image3MouseDown - и ничего!
Вадим К

Вадим К (статус: Академик), 23 июля 2007, 19:09 [#5]:

а ff точно навно 33? а если прибрать условие?
а если 4 параметр попробывать поменять?
Галочка "подтверждения прочтения" - вселенское зло.
Dron

Dron (статус: Студент), 23 июля 2007, 19:13 [#6]:

А цвет заливки и стиль не забыли задать?
С уважением.
Аксион

Аксион (статус: 4-ый класс), 23 июля 2007, 19:15 [#7]:

FF точно равно 33 ^_^ ,при замене 4 параметра тоже самое тоесть ничего
Аксион

Аксион (статус: 4-ый класс), 23 июля 2007, 19:17 [#8]:

Дрон стиль и цвет заданы
IMAGE3.Canvas.FloodFill(x,y,label11.Color,fsSurface );
Вадим К

Вадим К (статус: Академик), 23 июля 2007, 19:33 [#9]:

Там всё работает. Просто там вкралась хитрость. цвет указанный в процедуре нужен только погда, когда четвёртый параметр - fsBorder. Здесь цвет указывает цвет границы для заливки. А сам цвет заливки задаётся через цвет кисти
компонент.Canvas.brush.color:=clЦвет
Галочка "подтверждения прочтения" - вселенское зло.
Dron

Dron (статус: Студент), 23 июля 2007, 19:33 [#10]:

А если заданы, то зачем вы привели ещё раз эту строчку?
И каким образом вы их задали?
С уважением.
Dron

Dron (статус: Студент), 23 июля 2007, 19:37 [#11]:

Вадим К: я поэтому и спрашивал, заданы ли цвет и стиль заливки...
Матвеев Мефодий Олегович: вы когда начнёте документацию внимательно читать? Если в процедуре есть параметр-цвет, то это не значит, что это непременно цвет заливки.
Собственно, цвет там и передаётся для того, чтобы определить, что заливать, согласно режиму заливки, указанному в последнем параметре.
С уважением.
Аксион

Аксион (статус: 4-ый класс), 23 июля 2007, 19:38 [#12]:

Гммм.... даже так не работает компонент.Canvas.brush.color:=clЦвет
Аксион

Аксион (статус: 4-ый класс), 23 июля 2007, 19:39 [#13]:

АААААААААААААААААААА Что я делаю не так!!!!!!!!
Аксион

Аксион (статус: 4-ый класс), 23 июля 2007, 19:43 [#14]:

Добрые люди помогите идиоту дайте исходник
Аксион

Аксион (статус: 4-ый класс), 23 июля 2007, 19:48 [#15]:

О прогресс я изменил режим на fsBorder теперь вроде чтото получается правдо только если цвет заливки равен цвету замкнутой границы
Вадим К

Вадим К (статус: Академик), 23 июля 2007, 19:49 [#16]:

а попробуйте рисовать не на Image (Который кстати для этого не предназначен), а на PaintBox.
Исходники, исходники. А исходники жизни вам не надо?
Галочка "подтверждения прочтения" - вселенское зло.
Вадим К

Вадим К (статус: Академик), 23 июля 2007, 19:50 [#17]:

>>правдо только если цвет заливки равен цвету замкнутой
Ну так и должно быть
Галочка "подтверждения прочтения" - вселенское зло.
Аксион

Аксион (статус: 4-ый класс), 23 июля 2007, 19:56 [#18]:

Исходники жизни ненадо (думая вещи пострашнее этого в мире не найдётся), а на счёт PaintBox вроде тоже не ладится, вообще мне надо сделать инструмент типа ведра в MS paint ЧТОБЯ ЗАЛИВАТЬ ОБЛАСТЬ ВНУТРИ ЗАМКНУТОЙ ГРАНИЦЫ
Аксион

Аксион (статус: 4-ый класс), 23 июля 2007, 19:58 [#19]:

Вот fsBorder работает а fsSurface нет
Dron

Dron (статус: Студент), 23 июля 2007, 20:03 [#20]:

Прочитайте внимательно мой ответ и посмотрите исходник. Только попытайтесь понять, как это работает, а не просто копируйте в свой редактор.
Кстати, раз вы не справились с карандашом и заливкой, логичный вопрос: а какие инструменты вы ещё реализовали?
С уважением.

Страницы: [1] [2] [3] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:26
Выполнено за 0.04 сек.