|
Вопрос # 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 дней с момента отправки ответа)
Приложение: Переключить в обычный режим- procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- begin
- Image1.Canvas.Brush.Color:=ColorBox1.Selected;
- Image1.Canvas.Brush.Style:=bsSolid;
- Image1.Canvas.FloodFill(X,Y,Canvas.Pixels[X,Y],fsSurface);
- 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 (статус: Студент), 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 (статус: Студент), 23 июля 2007, 19:33 [#10]:
А если заданы, то зачем вы привели ещё раз эту строчку?
И каким образом вы их задали?
С уважением.
|
|
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 (статус: Студент), 23 июля 2007, 20:03 [#20]:
Прочитайте внимательно мой ответ и посмотрите исходник. Только попытайтесь понять, как это работает, а не просто копируйте в свой редактор.
Кстати, раз вы не справились с карандашом и заливкой, логичный вопрос: а какие инструменты вы ещё реализовали?
С уважением.
|
Страницы: [1] [2] [3] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|