Рисования в Lazarus
Модератор: Модераторы
-
kolian2000
- новенький
- Сообщения: 11
- Зарегистрирован: 22.12.2012 19:04:31
Вижу мне некто не поможет
kolian2000
А где в Вашем коде красный кружок рисуется после клика мышкой по изображению?
Добавлено спустя 15 минут 2 секунды:
Если я правильно понял Ваш НЕкомментированный код (
), то Вы постоянно всё стираете:
Из-за этого у Вас и ничего не получается. Стирание уберите, а вместо него, чтобы убрать изображение стада тараканов, рисуете их на том же месте, только режим пера поставьте pmXor (или pmNotXor - я забыл, какой иенно, проверьте сами). При этом получится, что второе рисование тем же цветом на том же самом месте просто восстанавливает цвет фона, а старые изображения в другом месте стираться не будут.
А где в Вашем коде красный кружок рисуется после клика мышкой по изображению?
Добавлено спустя 15 минут 2 секунды:
Если я правильно понял Ваш НЕкомментированный код (
Код: Выделить всё
Image1.Canvas.FillRect(0,0,511,511);Из-за этого у Вас и ничего не получается. Стирание уберите, а вместо него, чтобы убрать изображение стада тараканов, рисуете их на том же месте, только режим пера поставьте pmXor (или pmNotXor - я забыл, какой иенно, проверьте сами). При этом получится, что второе рисование тем же цветом на том же самом месте просто восстанавливает цвет фона, а старые изображения в другом месте стираться не будут.
-
vladimir76
- незнакомец
- Сообщения: 4
- Зарегистрирован: 30.01.2016 12:00:16
А как без прямоугольника закрасить область рисования белым цветом? Без этого рисуется чёрный квадрат. Я так понял, что этот эффект из глубин WinAPI. Но ни там, ни в Delphi с Lazarus не удаётся избавится от него без квадрата.
Кстати, не подскажете, как изменить размер холста с сохранением нарисованного, и закрашиванием новой области белым цветом? Или может подскажете, как сохранить нарисованное, а после увеличения размера холста вернуть обратно, разместив по-центру?
Версия Lazarus 1.4.4
Кстати, не подскажете, как изменить размер холста с сохранением нарисованного, и закрашиванием новой области белым цветом? Или может подскажете, как сохранить нарисованное, а после увеличения размера холста вернуть обратно, разместив по-центру?
Версия Lazarus 1.4.4
возьми лист бумаги, нарисуй на нем, потом возьми лист побольше и пролей на него кровь конкурентов, а потом нарисуй на нем то что нарисовано на первом листе.
Так же и с программой, только конкуренты остаются без царапин.
Это не прямоугольник, это функция которая выполняет действие по самой простой форме. Если не нравится можно каждому пикселю давать цвет индивидуально через цикл, функция там же рядом лежит.
Можно копировать одну канву в другую "временную". Изменять первую и вставлять временную по нужным координатам в первую.
Так же и с программой, только конкуренты остаются без царапин.
Это не прямоугольник, это функция которая выполняет действие по самой простой форме. Если не нравится можно каждому пикселю давать цвет индивидуально через цикл, функция там же рядом лежит.
Можно копировать одну канву в другую "временную". Изменять первую и вставлять временную по нужным координатам в первую.
-
vladimir76
- незнакомец
- Сообщения: 4
- Зарегистрирован: 30.01.2016 12:00:16
Где взять эту временную канву? Пробовал использовать BitMap... Нарисованное сохраняется, но размер холста не увеличивается. Объясните подробнее. Когда и куда копировать. Когда возвращать.Sharfik писал(а):Можно копировать одну канву в другую "временную". Изменять первую и вставлять временную по нужным координатам в первую.
vladimir76 писал(а):Где взять эту временную канву? Пробовал использовать BitMap... Нарисованное сохраняется, но размер холста не увеличивается. Объясните подробнее. Когда и куда копировать. Когда возвращать.
Создаешь пустой проект, кидаешь на форму два компонента PaintBox.
И дальше на них тренируешься, вот код. Поиграйся с координатами, и функцией CopyRect.
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
A,B:TRect;
begin
PaintBox1.Canvas.Brush.Color:=clRed;
PaintBox1.Canvas.FillRect(25,25,50,50);
PaintBox2.Canvas.Brush.Color:=clBlue;
PaintBox2.Canvas.FillRect(150,150,250,250);
A:=Rect(20,20,60,60);
B:=Rect(180,180,200,200);
PaintBox2.canvas.CopyRect(B,PaintBox1.canvas,A);
//PaintBox2.canvas.Draw(); Или так.
end;
Когда разберешься что к чему, тогда начинай работать с TBitmap. Создаешь два экземпляра на основе этого класса и так же как с PaintBox работаешь, а потом результат через тот же CopyRect, Draw, Assign можно вывести на форму, TImage, TPaintBox и т.д. Нужно только созданному виртуально объекту через свойства ширины и высоты задать размеры холста.
PS1:Берешь нужный тебе объект и ставишь после него точку, ждем появления выпадающего списка подсказки и смотрим какие функции нам доступны. Ищешь по смыслу нужные тебе.
PS2: d C:\Lazarus\examples\canvas_test есть примеры кодов использования канвы.
PS3: Yandex=Delphi+Canvas+Bitmap+Faq, но лучше книжку купить Архангельского.
-
vladimir76
- незнакомец
- Сообщения: 4
- Зарегистрирован: 30.01.2016 12:00:16
Спасибо! Буду экспериментировать.
-
vladimir76
- незнакомец
- Сообщения: 4
- Зарегистрирован: 30.01.2016 12:00:16
Здравствуйте! Возникла ещё одна проблема. На форме слева ScrollBox с Image внутри. Справа GroupBox с полями и кнопками. При изменении размера формы ScrollBox тоже меняет размеры, а GroupBox сохраняет своё положение у правого края формы. Проблема вот в чём. При изменении размера холста у Image через битмап, во время изменения размера появляется чёрная полоска между GroupBox и правой границей формы. Такая же полоска и над нижней границей формы. Её размер зависит от степени отставания GroupBox-а и ScrollBox-а от правой и нижней границы формы, при её перемещении. При завершении изменения размера эта полоска пропадает. Если при изменении размера формы не менять размера холста Image, то чёрной полоски не появляется. Хотя отставание GroupBox-а и ScrollBox-а ни куда не девается.
Может кто что посоветует.
Может кто что посоветует.
