Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №20.pdf
Скачиваний:
17
Добавлен:
16.03.2015
Размер:
737.92 Кб
Скачать

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

Класс 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}.