Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
Класс TBrush
Кисть (Brush) используется методами, обеспечивающими вычерчивание замкнутых областей, например геометрических фигур, для заливки (закраски) этих областей. Кисть, как объект, обладает свойствами, перечисленными в таблице 5.
В Delphi кисть представлена классом TBrush и, по сути, является объектной оболочкой Delphi для системного объекта Windows – HBrush.
Таблица 5 – Свойства кисти
Свойство
property Bitmap: TBitmap;
property Color: TColor; property Style: TBrushStyle;
Обратите внимание, что свойство Bitmap содержит ссылку на объект класса TBitmap. Перед обращением к свойству этот объект нужно создать.
Свойство Color задает цвет заливки. В таблице 6 перечислены некоторые именованные константы (тип TColor), которые можно использовать в качестве значения свойства Сolor.
Таблица 6 – Стандартные цвета
Константа
clBlack clMaroon clGreen clSilver clRed clLime clOlive clBlue clNavy clFuchsia clPurple clAqua clTeal
Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
Константа
clWhite
clGray
Константы, задающие стиль заполнения области приведены в таблице 7.
Таблица 7 – Стили заполнения области
Константа
bsSolid
bsClear
bsHorizontal
bsVertical
bsFDiagonal
bsBDiagonal
bsCross
bsDiagCross
Ниже приведен пример создания программы демонстрирующей различные типы заливок. Создайте новое приложение. В форму frmBrushDemo в секцию public добавьте метод
procedure Draw;
В этом методе будет происходить прорисовка поверхности формы. Далее создайте обработчики событий OnPaint и OnResize. Полный листинг программы приведен в листинге 3.
Листинг 3 – Программа «Кисть»
unit UBrush;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls;
type
TfrmBrushDemo = class(TForm)
procedure FormPaint(Sender: TObject); private
{Private declarations } public
{Public declarations } procedure Draw;
end;
var
frmBrushDemo: TfrmBrushDemo;
implementation
Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
var BrushNames:array [0..7] of string=
('bsSolid', 'bsClear', 'bsHorizontal', 'bsVertical', 'bsFDiagonal', 'bsBDiagonal', 'bsCross', 'bsDiagCross');
{$R *.dfm}
procedure TfrmBrushDemo.Draw; const boxsize=30;//размер квадрата
BrushTitle='Brush demo';
var k:integer; //счетчик по типам заливки
ColInterval:Integer; //интервал между строками x, y:Integer;
begin ColInterval:=3; //очищаем рисунок
Canvas.Brush.Style:=bsSolid;
Canvas.Brush.Color:=clWhite;
Canvas.FillRect(ClientRect); //рисуем надпись по середине окна
Canvas.TextOut((Width - Canvas.TextWidth(BrushTitle))div 2, 15, BrushTitle);
x:=10;
y:=50;
//перебираем стили заполнения for k:=0 to 7 do
begin
//устанавливаем текущий стиль заполнения
Canvas.Brush.Style:=TBrushStyle(k); //устанавливаем цвет
Canvas.Brush.Color:=clRed;
//отрисовывает образец
Canvas.Rectangle(x, y, x+boxsize, y+boxsize);
//подписываем образец
Canvas.Brush.Style:=bsSolid;
Canvas.Brush.Color:=clWhite; Canvas.TextOut(x, y+boxsize, BrushNames[k]);
x:=x+boxsize*ColInterval;
if x>Width-2*boxsize then //перенос на другую строку begin
x:=10;
y:=y+boxsize*2; end;{if}
end;{for} end;
procedure TfrmBrushDemo.FormPaint(Sender: TObject); begin
Draw;
end;
end.
Откомпилируйте и запустите программу. На экране появятся квадраты, заполненные различными типами заливки (рисунок 6). При изменении размеров окна содержимое окна будет изменяться таким образом, чтобы оно могло разместится в окне. Для реализации этой способности назначьте метод FormPaint в качестве обработчика события OnResize.
Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
Рисунок 6 – Вид окна программы «Кисть»
Класс TPen
Перейдем к следующему объекту. С помощью класса TPen создается объект-перо, который является системной оболочкой для системного объекта HPen.
Перо используется для вычерчивания точек, линий, контуров геометрических фигур: прямоугольников, окружностей, эллипсов, дуг и др. Вид линии, которую оставляет перо на поверхности холста, определяют свойства объекта TPen, которые перечислены в таблице 8.
Таблица 8 – Свойства класса TPen
Свойство
property Color:TColor;
property Width:Integer;
property Style:TPenStyle;
property Mode:TPenMode;
Свойство Style определяет вид линии, которая может быть непрерывной или прерывистой, состоящей из штрихов различной длины. В таблице 9 перечислены именованные константы, позволяющие задать стиль линии.
Таблица 9 – Стили линий
Константа
psSolid
psDash
psDot
psDashDot
Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
Константа
psDashDotDot
psClear
Обратите внимание, что толщина пунктирной линии не может быть больше 1. Если значение свойства Width больше единицы, то пунктирная линия будет выведена как сплошная.
Свойство Mode определяет, как будет формироваться цвет точек линии в зависимости от цвета точек холста, через которые эта линия прочерчивается. По умолчанию вся линия вычерчивается цветом, определяемым значением свойства Color.
Однако можно задать инверсный цвет линии по отношению к цвету фона. Это гарантирует, что независимо от цвета фона все участки линии будут видны, даже в том случае, если цвет линии и цвет фона совпадают.
В таблице 10 перечислены некоторые константы, которые можно использовать в качестве значения свойства Mode.
Таблица 10 – Режимы вычерчивания линий
Константа
pmBlack
pmWhite
pmCopy
pmNotCopy
pmNot
pmNotXor
Ниже приведен пример программы демонстрирующий вывод всех типов линий. Поместите на форму frmPenDemo компонент TPanel (pnCommand). Установите значение свойства Align компонента pnCommand равным alBottom. Поместите на панель
(pnCommand) компоненты TButton (btnExit), TColorBox (cbxColor) и два компонента
TRadioGroup (rbBkColor, rbLineColor). Компонент TColorBox находится на вкладке
Additional палитры компонентов и представляет собой специализированный выпадающий список (TComboBox) для выбора цвета. Свойства этого компонента аналогичны свойствам компонента TComboBox, текущий выбранный цвет находится в свойстве Selected. Разместите компоненты как показано на рисунке 7.
Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
Рисунок 7 – Вид формы после добавления компонентов
Установите свойство Anchors компонентов помещенных на форму таким образом, чтобы их положение выравнивалось относительно правого нижнего угла панели (pnCommand). Листинг программы приведен ниже (см. листинг 4).
Листинг 4 – Программа демонстрирующая стили линий
unit UPen;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type
TfrmPenDemo = class(TForm) pnCommand: TPanel; btnExit: TButton; cbxColor: TColorBox; rbBkColor: TRadioButton; rbLineColor: TRadioButton;
procedure FormPaint(Sender: TObject); procedure btnExitClick(Sender: TObject); procedure cbxColorChange(Sender: TObject); procedure FormCreate(Sender: TObject);
private
{Private declarations } public
{Public declarations }
FHeight:Integer; //высота области для прорисовки
FBkColor:TColor; //цвет фона FLineColor:TColor;//цвет линий procedure Draw; //прорисовка окна
end;
Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
var frmPenDemo: TfrmPenDemo;
implementation
var PenNames:array [0..6] of string=('psSolid', 'psDash', 'psDot', 'psDashDot', 'psDashDotDot', 'psClear', 'psInsideFrame');
{$R *.dfm}
procedure TfrmPenDemo.Draw; const LineSize=150;//размер линии
Title='Pen demo';
var k:integer; //счетчик по типам линий x, y:Integer;
begin //рисуем фон
Canvas.Brush.Style:=bsSolid;
Canvas.Brush.Color:=FBkColor; Canvas.FillRect(Rect(0, 0, ClientWidth, FHeight)); //рисуем надпись по середине окна
Canvas.TextOut((Width - Canvas.TextWidth(Title))div 2, 15, Title);
x:=10;
y:=50;
//перебираем стили линий for k:=0 to 6 do
begin
//устанавливаем текущий стиль заполнения
Canvas.Pen.Style:=TPenStyle(k); //устанавливаем цвет линии
Canvas.Pen.Color:=FLineColor;
//рисуем образец линии
Canvas.MoveTo(x, y); Canvas.LineTo(x+linesize, y);
//подписываем образец
Canvas.TextOut(x+linesize+5,
y - Canvas.TextHeight(PenNames[k]) div 2, PenNames[k]); y:=y+30;
end;{for} end;{Draw}
procedure TfrmPenDemo.FormPaint(Sender: TObject); begin
FHeight:=ClientHeight - pnCommand.Height-1; Draw;
end;{FormPaint}
procedure TfrmPenDemo.btnExitClick(Sender: TObject); begin
Close;
end;
Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
procedure TfrmPenDemo.cbxColorChange(Sender: TObject); begin
//перерисовываем экран, если изменялись настройки цвета if rbBkColor.Checked then FLineColor:=cbxColor.Selected
else FBkColor:=cbxColor.Selected; Draw;
end;{cbxColorChange}
procedure TfrmPenDemo.FormCreate(Sender: TObject); begin
//уставливаем текущий цвет фона
FBkColor:=clWhite; end;{FormCreate} end.{UPen}
Рассмотрим еще один несложный пример на использование различных режимов рисования пером. По умолчанию устанавливается режим рисования пером (TPen) цветом Color (Mode=pmCopy). Рассмотрим еще один режим рисования, при котором значение свойства Mode равно pmNotXor (см. таблицу 9). При этом режиме рисования цвет каждой точки нарисованной пером будет определяться следующим образом: к значениям цвета точек фона и точек пера будет применена логическая операция или (xor), затем к полученному результату будет применена логическая операция отрицания (not). Особенностью данного режима рисования линий является то, что если нарисовать, например линию два раза, то цвет точек фона не изменится, т.е. линия будет стерта. Такой режим рисования широко используется в различных графических редакторах.
Ниже приведен пример программы для демонстрации рисования линий в режиме NotXor. Разместите на форме frmCLine компонент TImage (Image) и задайте значение его свойства Align равным alClient. Создайте обработчики для событий OnMouseDown,
OnMouseMove, OnMoveUp (листинг 5).
Листинг 5 – Демонстрация рисования линий в режиме NotXor
unit UCLine;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls;
type
TfrmCLine = class(TForm) Image: TImage;
procedure ImageMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); procedure ImageMouseUp(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); procedure ImageMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
private
{Private declarations } public
{Public declarations } FDown:Boolean;
X0, Y0:Integer; OldX, OldY:Integer;
end;
Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
var frmCLine: TfrmCLine;
implementation
{$R *.dfm}
procedure TfrmCLine.ImageMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
//если нажата левая клавиша мыши if Button=mbLeft then
begin
FDown:=True;//переход в режим рисования линии //устанавливаем цвет линии
Image.Canvas.Pen.Color:=clBlack; //устанавливаем режим карандаша pmNotXor Image.Canvas.Pen.Mode:=pmNotXor; //запоминаем начальную точку линии
X0:=X;
Y0:=Y;
OldX:=X0;
OldY:=Y0;
end;
end;
procedure TfrmCLine.ImageMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
//устанавливаем режит копирования цвета
Image.Canvas.Pen.Mode:=pmCopy; //окончательный вариант линии
Image.Canvas.MoveTo(X0, Y0); Image.Canvas.LineTo(X, Y); FDown:=False;
end;
procedure TfrmCLine.ImageMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
begin
if FDown then //если нажата левая клавиша мыши with Image.Canvas do
begin
//стираем линию в старом положении
MoveTo(X0, Y0); LineTo(OldX, OldY);
//рисуем линию в новом положении
MoveTo(X0, Y0); LineTo(X, Y);
//запоминаем положение второго конца линии
OldX:=X;
OldY:=Y; end;{with}
end;{ImageMouseMove} end{UCLine}.