Рисования в Lazarus

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

kolian2000
новенький
Сообщения: 11
Зарегистрирован: 22.12.2012 19:04:31

Сообщение kolian2000 »

Вижу мне некто не поможет
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

kolian2000
А где в Вашем коде красный кружок рисуется после клика мышкой по изображению?

Добавлено спустя 15 минут 2 секунды:
Если я правильно понял Ваш НЕкомментированный код ( ;) ), то Вы постоянно всё стираете:

Код: Выделить всё

Image1.Canvas.FillRect(0,0,511,511);

Из-за этого у Вас и ничего не получается. Стирание уберите, а вместо него, чтобы убрать изображение стада тараканов, рисуете их на том же месте, только режим пера поставьте pmXor (или pmNotXor - я забыл, какой иенно, проверьте сами). При этом получится, что второе рисование тем же цветом на том же самом месте просто восстанавливает цвет фона, а старые изображения в другом месте стираться не будут.
vladimir76
незнакомец
Сообщения: 4
Зарегистрирован: 30.01.2016 12:00:16

Сообщение vladimir76 »

А как без прямоугольника закрасить область рисования белым цветом? Без этого рисуется чёрный квадрат. Я так понял, что этот эффект из глубин WinAPI. Но ни там, ни в Delphi с Lazarus не удаётся избавится от него без квадрата.

Кстати, не подскажете, как изменить размер холста с сохранением нарисованного, и закрашиванием новой области белым цветом? Или может подскажете, как сохранить нарисованное, а после увеличения размера холста вернуть обратно, разместив по-центру?

Версия Lazarus 1.4.4
Аватара пользователя
Sharfik
энтузиаст
Сообщения: 836
Зарегистрирован: 20.07.2013 01:04:30

Сообщение Sharfik »

возьми лист бумаги, нарисуй на нем, потом возьми лист побольше и пролей на него кровь конкурентов, а потом нарисуй на нем то что нарисовано на первом листе.
Так же и с программой, только конкуренты остаются без царапин.

Это не прямоугольник, это функция которая выполняет действие по самой простой форме. Если не нравится можно каждому пикселю давать цвет индивидуально через цикл, функция там же рядом лежит.
Можно копировать одну канву в другую "временную". Изменять первую и вставлять временную по нужным координатам в первую.
vladimir76
незнакомец
Сообщения: 4
Зарегистрирован: 30.01.2016 12:00:16

Сообщение vladimir76 »

Sharfik писал(а):Можно копировать одну канву в другую "временную". Изменять первую и вставлять временную по нужным координатам в первую.
Где взять эту временную канву? Пробовал использовать BitMap... Нарисованное сохраняется, но размер холста не увеличивается. Объясните подробнее. Когда и куда копировать. Когда возвращать.
Аватара пользователя
Sharfik
энтузиаст
Сообщения: 836
Зарегистрирован: 20.07.2013 01:04:30

Сообщение 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 »

Спасибо! Буду экспериментировать.
vladimir76
незнакомец
Сообщения: 4
Зарегистрирован: 30.01.2016 12:00:16

Сообщение vladimir76 »

Здравствуйте! Возникла ещё одна проблема. На форме слева ScrollBox с Image внутри. Справа GroupBox с полями и кнопками. При изменении размера формы ScrollBox тоже меняет размеры, а GroupBox сохраняет своё положение у правого края формы. Проблема вот в чём. При изменении размера холста у Image через битмап, во время изменения размера появляется чёрная полоска между GroupBox и правой границей формы. Такая же полоска и над нижней границей формы. Её размер зависит от степени отставания GroupBox-а и ScrollBox-а от правой и нижней границы формы, при её перемещении. При завершении изменения размера эта полоска пропадает. Если при изменении размера формы не менять размера холста Image, то чёрной полоски не появляется. Хотя отставание GroupBox-а и ScrollBox-а ни куда не девается.

Может кто что посоветует.
Ответить