
- •1.Операционные системы, классификация, функциональные
- •2. Подсистема защиты информации
- •3. Многослойность ос, ядро и вспомогательные функции.
- •4. Управление оперативной памятью: основные подходы.
- •2 Способа преобразования виртуального адреса в физический.
- •Организация виртуальной памяти, стратегии вытеснения страниц
- •6. Преобразование виртуального адреса в физический
- •9. Структурная обработка исключений
- •10. Пример работы с ис (конвертирование графических форматов)
- •11. Создание компонентов, иерархия, области видимости
- •12. Создание свойств
- •13. События компонентов
- •14. Пример создания компонента часы
- •15. Пример создания компонента с опубликованным свойством Tstrings.
- •16. Класс Tstrings
- •17. Свойства и методы Tcanvas
- •18. Встроенные графические классы
17. Свойства и методы Tcanvas
Обеспечивает пространство (холст, канву) для создания, хранения и модификации графических объектов
Модуль graphics
Класс TCanvas является основой графической подсистемы Delphi. Канва обеспечивает:
· Загрузку и хранение графических изображений
· Создание новых и изменение хранимых изображений с помощью пера, кисти, шрифта
· Рисование и закраску различных фигур, линий, текстов
· Комбинирование различных изображений
Свойства:
Brush Определяет цвет и стиль заполнения замкнутых фигур и фона.
Canvas Orientation Определяет обычную (слева направо) и восточную (справа налево) ориентацию канвы и ее координат. Свойство только для чтения.
ClipRect Определяет доступную область рисования на канве и область, подлежащую перерисовке при событии OnPaint. Свойство только для чтения.
CopyMode Определяет режим копирования графического изображения на канву.
Font Определяет атрибуты шрифта, которым выводится текст
Handle Дескриптор канвы
LockCount Определяет, сколько раз блокирована канва в многопоточных приложениях. Свойство только для чтения.
Pen Определяет свойства пера, рисующего линии и фигуры.
PenPos Определяет текущую позицию пера.
Pixels Определяет цвета пикселей.
TextFlags Определяет способ вывода текста на канву.
Некоторые методы:
Draw Рисует графическое изображение в указанную позицию канвы
LineTo Рисует на канве прямую линию, начинающуюся с текущей позиции пера и кончающуюся указанной точкой
MoveTo Изменяет текущую позицию пера на заданную, ничего не рисуя
TextOut Пишет указанную строку текста на канве, начиная с указанной позиции
Rectangle Рисует прямоугольник
Нарисовать на форме прямоугольник: MainForm.Canvas.Rectangle (10, 10, 200, 100)
18. Встроенные графические классы
Свойства и методы TCanvas предназначены для создания новых изображений, но в Delphi имеются также несколько классов для хранения и обработки изображений, уже созданных в различных графических форматах . Эти классы не являются компонентами, их экземпляры нужно создавать «вручную». Три вида изображений, стандартных для Windows, инкапсулированы в классах TBitMap (битовая карта, растровая картинка), TIcon (значок), TMetaFile (метафайл). Для работы с популярным форматом Jpeg предназначен класс TJpegImage. Эти четыре класса являются потомками абстрактного класса TGraphic.
Опишем некоторые основные методы и свойства, используемые далее в лабораторных работах. На уровне TGraphic определены:
procedure LoadFromFile(const FileName: string); virtual; |
Загрузка изображения из файла |
procedure SaveToFile(const FileName: string); virtual; |
Запись изображения в файл |
property Empty: Boolean; |
истина, если объект не содержит данных |
property Height: Integer; |
высота графического объекта |
property Width: Integer; |
ширина |
property Transparent: Boolean; |
прозрачен ли объект при отрисовке |
Первые два метода перекрываются в классах потомках.
Свойства TbitMap:
property TransparentColor: TColor; |
Цвет, который будет прозрачным, если TransparentMode = tMFixed и Transparent=True |
property TransparentMode: TTransparentMode; type TTransparentMode= (tmAuto, tmFixed); |
Если tmAuto, прозрачны будут участки с цветом верхнего левого пиксела |
property Canvas: TCanvas; |
Холст для рисования (имеется только у TBitMap!) |
Изображения формата Jpeg получаются сжатием изображений в формате битовой карты. Соответственно следующее свойство TJpegImage
property CompressionQuality: TJPEGQualityRange;
type TJPEGQualityRange = 1..100
определяет качество сжатого изображения и его размер (значение по умолчанию 75), а метод Compress сжимает Jpeg-изображение с учетом этого значения.
Метод
procedure Assign(Source: TPersistent); override;
классов TJpegImage и TBitMap копирует изображение из Source в объект, вызвавший этот метод, при этом происходит преобразование форматов.
Часто бывает удобно пользоваться классом TPicture, который является надстройкой над TBitMap, TJpegImage, TIcon, TMetaFile и может содержать объекты любого из этих классов.
Объекты хранятся в его свойстве Graphic: TGraphic (к ним также можно обратиться через одноименные свойства TPicture). Методы SaveToFile и LoadFromFile класса TPicture анализируют тип файла по его расширению и вызывают методы SaveToFile и LoadFromFile соответствующих объектов, например TBitMap.
Следующий простой пример демонстрирует использование объекта TBitMap для построения движущихся частично прозрачных изображений. Изображение (эллипс, вписанный в прямоугольник) рисуется на BitMap и двигается по окружности при наступлении события OnTimer компонента TTimer. Интервал Timer1.Interval между событиями OnTimer вводится с помощью TEdit.
unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
UpDown1: TUpDown;
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure FormPaint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
var x, y, orbita, rad: integer;
angle,pi20: real;
b, pic, buffer: TBitMap;
Dest, Source: Trect;
procedure TForm1.FormCreate(Sender: TObject);
begin
b:=TBitMap.Create;
b.LoadFromFile('athena.bmp');
angle:=pi/2;
pi20:=pi/20;
clientwidth:=400;
ClientHeight:=400;
rad:= clientwidth div 4;
orbita:=clientwidth div 2 - rad;
x:=orbita;
y:=0;
buffer:=TBitMap.Create;
buffer.Height:=rad;
buffer.Width:=rad*2;
Pic:=TBitMap.Create;// Создание картинки
Pic.Height:=rad;
Pic.Width:=rad*2;
with pic.Canvas do begin
pen.Color:=clGreen;
brush.Color:=clGreen;
Rectangle(0,0,rad*2,rad);
pen.color:=clBlue;
brush.Color:=ClBlue;
Ellipse(0,0,rad*2,rad);
end;
{Прозрачным на картинке будет голубой цвет}
Pic.TransparentColor:=clBlue;
Pic.Transparent:=true; // Активизация прозрачности
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
{ Восстановить фон из buffer}
Canvas.CopyRect(Source, buffer.Canvas, Dest);
angle := angle+pi20;
x := orbita+round(orbita*cos(angle));
y := orbita-round(orbita*sin(angle));
{ Запомнить фон нового места в буфере}
Source := Rect(x,y,x+2*rad,y+rad);
Dest := Rect(0,0,2*rad,rad);
buffer.Canvas.CopyRect(Dest, Canvas, Source);
{ Нарисовать картинку на новом месте}
Canvas.Draw(x,y,Pic);
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin
Timer1.Interval:=StrToInt(Edit1.Text);
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
Source:=rect(x,y,x+2*rad,y+rad);
Dest:=rect(0,0,2*rad,rad);
with Canvas do begin
StretchDraw(ClientRect,b); // Вывод обоев
buffer.Canvas.CopyRect(dest,Canvas,Source);
Draw(x,y,Pic); // Вывод картинки
end;
end;