Теперь давайте напишем пример, в котором увидим свойства карандаша в действии. Создайте новое приложение. Создайте обработчик события OnPaint и напишите в нем код, представленный в листинге:
procedure TForm1.FormPaint(Sender: TObject);
begin
//Рисуем сплошную линию (psSolid)
Canvas.Pen.Style:=psSolid;
Canvas.MoveTo(10,20);
Canvas.LineTo(200,20);
//Рисуем psDash линию
Canvas.Pen.Style:=psDash;
Canvas.MoveTo(10,40);
Canvas.LineTo(200,40);
//Рисуем psDash линию
Canvas.Pen.Style:=psDot;
Canvas.MoveTo(10,60);
Canvas.LineTo(200,60);
//Рисуем psDashDot линию
Canvas.Pen.Style:=psDashDot;
Canvas.MoveTo(10,80);
Canvas.LineTo(200,80);
//Рисуем psDashDotDot линию
Canvas.Pen.Style:=psDashDotDot;
Canvas.MoveTo(10,100) ;
Canvas.LineTo(200,100);
//Рисуем psClear линию
Canvas.Pen.Style:=psClear;
Canvas.MoveTo(10,120);
Canvas.LineTo(200,120);
//Рисуем psInsideFrame линию
Canvas.Pen.Style:=psInsideFrame;
Canvas.MoveTo(10,140);
Canvas.LineTo(200,140);
end;
Результат работы программы вы можете увидеть на рис.
В данном примере по событию onPaint (когда надо перерисовать форму) поочередно рисуются линии разного стиля. Для этого сначала выбирается нужный стиль (например, Canvas.Pen.Style:=psSolid выбирает стиль сплошной линии).
Потом перемещается карандаш в точку начала линии— canvas.MoveTo(х, y). Meтод MoveTo перемещает карандаш в позицию, указанную в качестве параметров х и у. При перемещении не происходит никакого рисования на холсте (canvas), х и y—это не сантиметры и не миллиметры, а количество пикселов (количество экранных точек).
Отсчет координаты х идет слева. Это значит, что левая сторона окна равна нулевой позиции х, а правая сторона окна—это максимальное значение. Но это не означает, что х не может быть отрицательным или больше максимума. Вы без проблем можете указывать любые значения, только нужно учитывать, что часть линии может уйти за пределы окна.
Отсчет координаты y идет сверху. Верхнее обрамление окна является нулевой точкой y. При этом заголовок окна (с названием формы и системными кнопками) не входит в пространство клиентской области окна.
Теперь мы должны нарисовать линию с помощью метода LineTo (х, y) . В качестве параметров передаются конечные координаты линии. Отрезок будет нарисован, начиная от текущей позиции карандаша, куда мы перешли с помощью метода MoveTo, и до координат, указанных при вызове метода LineTo.
После прорисовки первой линии выбираем следующий стиль и перемещаемся в позицию на 20 пикселов ниже уже нарисованной линии. После этого рисуем следующую линию.
Теперь добавим в нашу программу возможность смены цвета карандаша. Для этого установим на форму кнопку с надписью "Изменить цвет" и компонент coiorDialog с вкладки Dialogs. Компонент coiorDialog предназначен для отображения стандартного диалога выбора цвета. На форме он будет выглядеть в качестве простого квадратика с пиктограммой и при запуске не будет виден.
Для события onclick кнопки напишем следующий код:
if ColorDialogl.Execute then
Canvas.Pen.Color:=ColorDialogl.Color;
FormPaint(nil);
В первой строке кода отображается окно выбора цвета (ColorDialog1. Execute). Если пользователь выбрал цвет и не нажал ОК (нажал отмену или нажал кнопку крестика в заголовке), то окно возвращает значение false. Поэтому мы проверяем, если результат показа окна равен true, то изменить цвет:
Напоминаю, что по умолчанию конструкция if проверяет указанный код на равенство true, если не указано обратное. В связи с этим эту же конструкцию можно было бы записать так:
Результат выбранного цвета записывается в свойство color компонента ColorDialogl. Именно его мы и присваиваем цвету карандаша canvas.Pen.color. После этого нужно только перерисовать рисунок. Для этого явно вызывается процедура— обработчик события OnPaint формы. У нас обработчик называется FormPaint, именно его и необходимо вызывать.
Можете запустить программу и проверить результат работы смены цветов линий.
Теперь добавим возможность выбора толщины линии. Для этого установим компонент upDown с вкладки Win32. Для события onclick этого компонента напишем следующий код:
procedure TFormi.UpDownlClick(Sender: TObject; Button: TUDBtnType);
begin
Canvas.Pen.Width:=UpDownl.Position;
Repaint;
end;
Компонент upDown состоит из двух кнопок. Верхняя кнопка увеличивает внутренний счетчик. Нижняя — уменьшает. Текущее значение счетчика можно прочитать в свойстве Position. Именно это значение мы и присваиваем в свойство ширины карандаша Canvas . Pen. Width.
После этого вызывается метод главной формы Repaint. Этот метод генерирует событие о том, что надо перерисовать содержимое окна. Это значит, что будет автоматически вызван обработчик события onPaint. Результат тот же, что и просто вызов напрямую обработчика, как это делалось после смены цвета. Но такой способ считается более правильным.