Части, которые просто нельзя собрать неправильно,
все же будут собраны неправильно.
Из законов Мэрфи.
Построение изображений из программы основано на вызове методов объекта Canvas (по англ. "холст"). У объекта Image есть свойство Canvas, поэтому запись команд рисования выглядит примерно так:
Image1.Canvas.команда;
Принцип рисования в Delphi заключается в том, что картинка строится пером (pen), которое перемещается по холсту, проводя на нем линии. Кроме пера, у холста еще есть кисть (brush), которой можно закрашивать большие области. Наконец, имеются отдельные команды для построения отрезков, прямоугольников, эллипсов (окружность – частный случай эллипса). Давайте нарисуем изображение, показанное на рис. 2.
Рис. 2 – Пример изображения.
Прежде всего надо понимать, что размер нашего поля рисования в пикселах – величина переменная. Пользователь может растянуть форму, поменять разрешение экрана и т.д. Поэтому ширину поля рисования нужно брать из свойства Image1.Width, а высоту – из свойства Image1.Height.
Как и обычно, процедуру рисования будем писать так, чтобы она вызывалась при нажатии на кнопку. Для этого поместим на форму кнопку "Рисовать". Процедура рисования будет выглядеть следующим образом:
procedure TForm1.Button1Click(Sender: TObject);
Begin
WITH Image1.Canvas DO
BEGIN
Brush.Color:=clWhite;
Pen.Color:=clBlack;
FillRect(Image1.ClientRect);
MoveTo(0,Image1.Height DIV 2);
LineTo(Image1.Width,Image1.Height DIV 2);
MoveTo(Image1.Width DIV 2,0);
LineTo(Image1.Width DIV 2,Image1.Height);
Brush.Color:=clGreen;
Rectangle(Image1.Width DIV 2 - 50, Image1.Height DIV 2 - 50,
Image1.Width DIV 2 + 50, Image1.Height DIV 2 + 50);
Brush.Color:=clRed;
Ellipse(Image1.Width DIV 2 - 10, Image1.Height DIV 2 - 10,
Image1.Width DIV 2 + 10, Image1.Height DIV 2 + 10);
END
end;
Разберемся, что здесь написано. Оператор WITH "выносит за скобки" слова Image1.Canvas, чтобы их не приходилось писать в каждой строчке. Команды Brush.Color и Pen.Color задают будущие цвета заливки и контура, соответственно. Сами цвета обозначаются по их имени, перед которым идут буквы cl, например, clWhite, clRed, clGreen. Команда FillRect рисует закрашенный прямоугольник. Здесь она применена для очистки всего поля рисования, поэтому в качестве прямоугольника задается тот прямоугольник, который занимает весь объект Image1. Он хранится в свойстве ClientRect. Проще говоря, команда FillRect(Image1.ClientRect)заливает весь холст цветом заливки.
Рисование отрезка от точки x1,y1 в точку x2,y2 выполняется пером в два этапа. Сначала перо командой MoveTo(x1,y1) позиционируется без проведения линии в начальную точку отрезка, а затем отрезок проводится командой LineTo(x2,y2). Координаты начал и концов отрезков показаны на рис. 2, они легко вычисляются. Не забывайте, что координаты на экране могут быть только целыми, поэтому надо использовать операцию целочисленного деления DIV.
Команда Rectangle рисует прямоугольник с заданными цветами контура и заливки. Прямоугольник задается координатами концов любой его диагонали. В нашем случае длина стороны прямоугольника будет 20 пикселов и он строится симметрично относительно середины холста.
Команда Ellipse строит окружности и эллипсы. Параметры ее немного необычны – нужно указать координаты концов диагонали прямоугольника, в который будет вписан эллипс или окружность.
Порядок рисования фигур имеет значение. Если переставить местами команды Rectangle и Ellipse, то прямоугольник закроет собой окружность и вы ее никогда не увидите.
Помимо сплошной заливки, можно применять и другие ее виды (штриховка, точки и т.д.), меняя свойство Style объекта Brush:
Рис. 3 – Способы заливки.
Значение bsSolid соответствует сплошной заливке, bsClear – ее отсутствию, что позволяет рисовать незакрашенные фигуры.
Для линий свойство Pen.Style устанавливает вид линии:
psSolid | сплошная линия |
psDash | пунктирная линия |
psDot | линия из точек |
psDashDot | штрих – пунктирная линия |
psDashDotDot | линия "тире – точка – точка" |
psClear | линия не рисуется (например, для построения объекта без контура) |