Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СРЕДСТВА ВИЗУАЛЬНОГО ПРОГРАММИРОВАНИЯ.doc
Скачиваний:
13
Добавлен:
02.05.2019
Размер:
2.13 Mб
Скачать

16.4. Графический инструментарий

Богатство изобразительных возможностей Windows связано с так называемым дескриптором контекста графического устройства DC (Device Context) и тремя входящими в него инструментами - шрифтом, пером и кистью. В Delphi созданы специализированные классы-надстройки, существенно упрощающие использование графических инструментов Windows: для контекста - класс TCanvas, для шрифта - TFont, для пера - ТРеп и для кисти - TBrush.

Связанные с этими классами объекты автоматически создаются для всех видимых элементов и становятся доступны программе

через свойства Canvas, Font, Pen и Brush.

16.4.1. Класс TFont

С помощью класса TFont создается объект-шрифт для любого графического устройства (экрана, принтера, плоттера и т. п.).

Свойства класса:

property Color: TColor;

Цвет шрифта

property Charset: TFontCharSet;

Набор символов. Для русскоязычных программ это свойство обычно имеет значение DEFAULTCHARSET или russian charset. Используйте значение OEMCHARSET для отображения текста MS-DOS (альтернативная кодировка)

property FontAdapter: IChangeNotifier;

Поставляет информацию о шрифте в компоненты ActveX  

property Handle:hFont;

Дескриптор шрифта. Используется при непосредственном обращении к API-функциям Windows

property Height: Integer;

Высота шрифта в пикселях экрана

property Name: TFontName;

Имя шрифта. По умолчанию имеет значение MS

Sans Serif

property Pitch: TFontPitch;

 

 

Определяет способ расположения букв в тексте: значение fpFixed задает моноширинный текст, при котором каждая буква имеет одинаковую ширину; значение fpVariabel определяет ропорциональный текст, при котором ширина буквы зависит от ее начертания; fpDefault определяет ширину, принятую для текущего шрифта

property PixelPerInch: Integer;

Определяет количество пикселей экрана на один дюйм реальной длины. Это свойство не следует изменять, т. к. оно используется системой для обеспечения соответствия экранного шрифта шрифту принтера

property Size: Integer;

Высота шрифта в пунктах (1/72 дюйма). Изменение этого свойства автоматически изменяет свойство Height и наоборот.

property Style: TFontStyles;

Стиль шрифта. Может принимать значение как комбинация следующих признаков: fsBold (жирный), fsltalic (курсив), fsUnderline (подчеркнутый), fsStrikeOut (перечеркнутый)

Для некоторых случаев может оказаться полезным метод

procedure Assign(Source: TPersistent);

с помощью которого значения свойств шрифтового объекта source присваиваются свойствам текущего шрифта. Метод не изменяет свойство pixeiperinch, поэтому его можно использовать для создания шрифта принтера по экранному шрифту и наоборот.

16.4.2. Класс ТРеп

С помощью класса треп создается объект-перо, служащий для вычерчивания линий. Свойства класса:

property Color: TColor;

Цвет вычерчиваемых пером линий

property Handle: Inte

ger;

Дескриптор пера. Используется при непосредственном обращении к API-функциям Windows

property Mode: TPenMode;

Определяет способ взаимодействия линий с фоном (см.ниже)

property Style: TPenStyle;

Определяет стиль линий (см. рис. 16.2). Учитывается только для толщины линий 1 пиксель. Для толстых линий стиль всегда ps Solid (сплошная)

property Width: Integer;

Толщина линий в пикселях экрана

Свойство Mode может принимать одно из следующих значений:

 pmBlack

Линии всегда черные. Свойства Color и Style игнорируются

pmWhite

Линии всегда белые. Свойства Color и Style игнорируются

pmNop

Цвет фона не меняется (линии не видны)

pmNot

Инверсия цвета фона. Свойства Color и Style игнорируются

pmCopy

Цвет линий определяется свойством Color пера

pmNotCopy

Инверсия цвета пера. Свойство Style игнорируется

pmMergePenNot

Комбинация цвета пера и инверсионного цвета фона

pmMaskPenNot

Комбинация общих цветов для пера и инверсионного цвета фона. Свойство Style игнорируется

pmMergeNotPen

Комбинация инверсионного цвета пера и фона

pmMaskNotPen 

Комбинация общих цветов для инверсионного цвета пера и фона. Свойство Style игнорируется

pmMerge

Комбинация цветов пера и фона

pmNotMerge

Инверсия цветов пера и фона. Свойство Style игнорируется

pmMask

Общие цвета пера и фона

pmNotMask

Инверсия общих цветов пера и фона

pmXor

Объединение цветов пера и фона операцией XOR

pinNotXor

Инверсия объединения цветов пера и фона операцией XOR

 Стили линий показаны на рис. 16.2.

Рис. 16.2. Стили линий

16.4.3. Класс TBrush

Объекты класса TBrush (кисти) служат для заполнения внутреннего пространства замкнутых фигур.

Свойства класса:

property Bitmap: TBitmap;

Содержит растровое изображение, которое будет использоваться кистью для заполнения. Если это свойство определено, свойства Color и Style игнорируются

property Color: TColor;

Цвет кисти

property Handle: Integer;

Дескриптор кисти. Используется при не посредственном обращении к API- функциям Windows

property Style: TBrushStyle;

Стиль кисти (см. рис. 16.3)

 

16.4.4. Класс TCanvas

Этот класс создает “канву”, на которой можно рисовать чертежными инструментами - пером, кистью и шрифтом. Объекты класса ЕСаnvas автоматически создаются для всех видимых компонентов, которые должны уметь нарисовать себя. Они инкапсулируют объекты Font, pen, Brush, а также многочисленные методы, использующие эти объекты.

Свойства класса:

property Brush: TBrush; property ClipRect: TRect;

Объект-кисть Определяет текущие размеры области, нуждающейся в прорисовке

property CopyMode: TCopyMode;

Устанавливает способ взаимодействия растрового изображения с цветом фона

property Font: TFont;

Объект-шрифт

property Handle: Integer;

Дескриптор канвы. Используется при непосредственном обращении к API-функциям Windows

property LockCount: In

tegers;

 

 

Счетчик блокировок канвы. Увеличивается на единицу при каждом обращении к методу Lock и уменьшается на единицу при обращении к Unlock

property Pen: TPen;

Объект-перо

property PenPos:TPoint;

Определяет текущее положение пера в пикселях относительно левого верхнего угла канвы

property Pixels[X,Y:Integer]: TColor;

Массив пикселей канвы

 

 

Свойство copyMode используется при копировании части одной канвы (источника) в другую (приемник) методом copyRect и может иметь одно из следующих значений:

cmBlackness

Заполняет область рисования черным цветом

cmDestInvert

Заполняет область рисования инверсным цветом фона

cmMergeCopy

Объединяет изображение на канве и копируемое изображение операцией and

cmMergePaint

Объединяет изображение на канве и копируемое изображение операцией OR

cmNotSrcCopy

Копирует на канву инверсное изображение источника

cmNotSrcErase 

Объединяет изображение на канве и копируемое изображение операцией OR и инвертирует полученное

cmPatCopy

Копирует образец источника

cmPatInvert

 

 

Комбинирует образец источника с изображением на канве с

помощью операции XOR

cmPatPaint

Комбинирует изображение источника с его образцом с помощью операции OR, затем полученное объединяется с изображением на канве также с помощью OR

cmSrcAnd 

 

Объединяет изображение источника и канвы с помощью операции AND

cmSrcCopy

Копирует изображение источника на канву

cmSrcErase

Инвертирует изображение на канве и объединяет результат с изображением источника операцией AND

cmSrcInvert

Объединяет изображение на канве и источник операцией XOR

cmSrcPaint

Объединяет изображение на канве и источник операцией OR

cmWhitness

Заполняет область рисования белым цветом

 С помощью свойства pixels все пиксели канвы представляются в виде двухмерного массива точек. Изменяя цвет пикселей, можно прорисовывать изображение по отдельным точкам.

Методы класса:

procedure Arc(X1, Y1, X2, Y2, ХЗ, Y3, Х4, Y4: Integer);

Чертит дугу эллипса в охватывающем прямоугольнике (Xl,Yl)-(X2,Y2). Начало дуги лежит на пересечении эллипса и луча, проведенного из его центра в точку (ХЗ, Y3), а конец - на пересечении с лучом из центра в точку (Х4, Y4). Дуга чертится против часовой стрелки (см. рис. 16.4, а)

procedure BrushCopy

(const Dest: TRect;

Bitmap: TBitmap;

const Source: TRect;

Color: TColor);

Копирует часть изображения Source на участок канвы Dest. Color указывает цвет в Dest, который должен заменяться на цвет кисти канвы. Метод введен для совместимости с ранними версиями Delphi. Вместо него следует пользоваться классом Т Image List

procedure Chord(XI,

Yl, X2, Y2, X3, Y3,

Чертит сегмент эллипса в охватывающем прямоуголь нике (XI, У1) - (X2, Y2). Начало дуги сегмента лежит на пересечении эллипса и луча, проведенного из его центра в точку (X3, Y3), а конец - на пересечении с лучом из центра в точку (X4, Y4). Дуга сегмента чертится против часовой стрелки, а начальная и конечная точки дуги соединяются прямой (см. рис. 16.4, б)

procedure CopyRect (Dest: TRect; Canvas: TCanvas;Source: TRect) ;

Копирует изображение Source канвы Canvas в участок Dest текущей канвы. При этом разнообразные специальные эффекты достигаются с помощью свойства CopyMode

procedure Draw(X, Y:Integer; Graphic:TGraphic) ;

Осуществляет прорисовку графического объекта Graphic так, чтобы левый верхний угол объекта расположился в точке (X, Y)

procedure DrawFocusRect (const Rect:TRect) ;

Прорисовывает прямоугольник с помощью операции XOR, поэтому повторная прорисовка уничтожает ранее вычерченный прямоугольник. Используется в основном для прорисовки нестандартных интерфейсных элементов при получении ими фокуса ввода и при потере его

procedure Ellipse(XI, Yl, X2,

Y2: Integers;

Чертит эллипс в охватывающем прямоугольнике (XI, Yl) - (X2, Y2). Заполняет внутреннее пространство эллипса текущей кистью

procedure FillRect(const Rect: TRect);

Заполняет текущей кистью прямоугольную область Rect, включая ее левую и верхнюю границы, но не затрагивая правую и нижнюю границы

procedure Flood-

Fill(X, Y: Integer;

Color: TColor; Fill Style: TFillStyle);

Производит заливку канвы текущей кистью. Залив

ка начинается с точки (X, Y) и распространяется вовсе стороны от нее. Если FillStyle=fsSurface, заливка распространяется на все соседние точки с цветом Color. Если FillStyle=fsBorder, наоборот, заливка прекращается на точках с этим цветом

procedure FrameRect(const Rect: TRect);

Очерчивает границы прямоугольника Rect текущей кистью толщиной в 1 пиксель без заполнения внутренней части прямоугольника

procedure LineTo(X,

Y: Integer);

Чертит линию от текущего положения пера до точки

(X,Y)

procedure Lock;

 

 

Блокирует канву в многопоточных приложениях для предотвращения использования канвы в других по токах команд

procedure MoveTo(X,Y: Integer);

Перемещает перо в положение (X, Y) без вычерчивания линий

procedure Pie(XI,

Yl, X2, Y2, X3, Y3,

X4, Y4: Longint);

 

 

 

Рисует сектор эллипса в охватывающем прямоугольнике (XI, Yl) - (X2, Y2). Начало дуги лежит на пересечении эллипса и луча, проведенного из его центра в точку (X3, Y3), а конец - на пересечении случом из центра в точку (X4, Y4). Дуга чертится против часовой стрелки. Начало и конец дуги соединяются прямыми с ее центром (см. рис. 16.4, в)

procedure Polygon.

(Points: array of TPoint) ; 

 

Вычерчивает пером многоугольник по точкам, заданным в массиве Points. Конечная точка соединяется с начальной и многоугольник заполняется кистью. Без заполнения используйте - Polyline

procedure Polyline

(Points: array of

TPoint);

Вычерчивает пером ломаную прямую по точкам, заданным в массиве Points

 

 

procedure Rectan

gle(XI, Yl, X2, Y2:

Integer);

Вычерчивает и заполняет прямоугольник (XI, Yl) -S(X2, Y2). Для вычерчивания без заполнения используйте FrameRect или Polyline

procedure Refresh;

Устанавливает в канве умалчиваемые шрифт и кисть

procedure RoundRect(Xl, Yl, X2,Y2, X3, Y3: Inte ger) ;

Вычерчивает и заполняет прямоугольник (XI,Yl)- (X2, Y2) со скругленными углами. Прямоугольник (XI, Yl) - (X3, Y3) определяет дугу эллипса для округления углов (см. рис. 16.4, г)

procedure Stretch Draw (const Rect:TRect; Graphic:

TGraphic );

Вычерчивает и при необходимости масштабирует графический объект Graphic так, чтобы он полностью занял прямоугольник Rect

 

function TextExtent

(const Text:String): TSize;

Возвращает ширину и высоту прямоугольника, охватывающего текстовую строку Text

 

function TextHeight

(const Text: String): Integer;

Возвращает высоту прямоугольника, охватывающего текстовую строку Text 

 

procedure TextOut(X,

Y: Integer; const Text: String) ;

Выводит текстовую строку Text так, чтобы левый

верхний угол прямоугольника, охватывающего текст, располагался в точке (X, Y)

procedure TextRect(Rect: TRect; X, Y:

Integer; const Text:

String) ;

Выводит текстовую строку Text так, чтобы левый верхний угол прямоугольника, охватывающего текст, располагался в точке (х, Y). Если при этом какая-либо часть надписи выходит из границ прямоугольника Rect, она отсекается и не будет видна

function TextWidth

(const Text:String): Integer;

Возвращает ширину прямоугольника, охватывающего текстовую строку Text 

 

function TryLock:

Boolean; 

Пытается заблокировать канву. Если она не заблокирована другим потоком команд, - True, в противном случае ничего не делает и возвращает False

procedure Unlock;

Уменьшает на 1 счетчик блокировок канвы

 

16.4.4.1. Дополнительные возможности API-функций

Замечу, что все богатство изобразительных возможностей Windows далеко не исчерпывается набором свойств и методов класса TCanvas: этот класс инкапсулирует лишь наиболее популярные приемы работы с чертежными инструментами. В этом разделе перечисляются некоторые функции Windows, которые не инкапсулирует класс TCanvas и которые способны значительно разнообразить текстовый вывод (именно он наиболее обеднен узкими рамками TCanvas).

Некоторые текстовые функции API

type TLogFont = record

If Height: Integer;

IfWidth: Integer; IfEs-

capment: Integer; IfOri-

entation: Integer; IfWeight: Integer;

If Italic: Byte; IfUnder-

line: Byte; IfStrikeOut:

Byte; IfCharSet: Byte;

IfOutPrecision: Byte;

IfClipPrecision: Byte;

IfQuality: Byte; IfPitchAndFamily: Byte;

1fFaceName: PChar ;

end;

function CreateFont(Font:

TLogFont): hFont;

Создает новый шрифт на основе данных в параметре Font. Назначение полей структуры TLogFont см. после таблицы

 

 

 

 

 function DrawText(DC:hDC; pText: PChar; varRect:'TRect; Format:UINT): Integer;

В прямоугольнике Rect выводит многострочный текст, на который указывает pText. Параметр Format используется для форматирования (см.ниже)

function ExtTextOut(DC:

hDC; X, Y: Integer; Op

tions: Integer; Rect:

TRect; pText: PChar;

Count: Integer; PX: PInteger): Bool; 

 

Выводит текст с нестандартными меж сим вольными расстояниями: X, Y - верхняя левая точка текста; Options - параметр, управляющий выводом (см. ниже); Rect - ограничивающий прямоугольник; pText - указатель на строку вывода; Count - количество выводимых символов; px - указатель на массивцелочисленных значений, определяющих межсимвольные расстояния: 1-й параметр - расстояние от 1-го до 2-го символа; 2-й параметр- расстояние от 2-го до 3-го символа и т. д.; если какой-то параметр равен 0, используется умалчиваемое межсимвольное расстояние

function GetBkColor(DC:hDC): TColor;

Возвращает цвет фона

 

function GetBkMode(DC:hDC) : Integer;

 

Возвращает режим прорисовки фона: Opaque -

фон прорисовывается заново при выводе текста; Transparent - фон не прорисовывается

function GetTextAlign(DC:

hDC) : Integer;

Возвращает выравнивание текста

 

function GetTextCharacterExtra(DC: hDC): Integer;

Возвращает межсимвольное расстояние

function SetBkColor(DC:hDC; Color: TColor): TColor;

Устанавливает новый цвет фона и возвращает старый, если обращение успешно

function SetBkMode(DC:hDC; Mode: Integer): Integer;

Устанавливает новый режим прорисовки фона и возвращает старый, если операция успешна

function SetTextAlign(DC:

hDC; Flags: Integer): Integer;

Устанавливает новое выравнивание текста и

возвращает старое, если вызов успешен  

function SetTextCharacterExtra(DC: hDC; CharExtra: Integer): Integer;

Устанавливает новое межсимвольное расстояние и возвращает старое, если вызов успешен

 Отдельные поля структуры TLogFont для функции CreateFontIndirect имеют следующий смысл:

if Height - высота шрифта в пунктах (1 пункт = 1/72 дюйма); если больше 0, определяет высоту “знакоместа” (с учетом выступающих над заглавным символом элементов в буквах Е, И), если меньше нуля - высоту “чистого” символа, если 0 - высоту выбирает Windows;

if width - средняя ширина символа; если 0, ширину устанавливает Windows;

ifEscapment - угол наклона базовой линии текста в десятых долях градуса относительно горизонтального направления; положительные значения - поворот по часовой стрелке; в Windows 95/98 совпадает СIfOrientation;

iforientation - угол наклона символов по отношению к базовой линии; в Windows NT для шрифтов True Type может отличаться от ifEscapment; для этого следует установить режим устройства отображения равным gm_Advanced (по умолчанию устанавливается gm_Compatible);

IfWeight - плотность шрифта (fm_DontCare=0 - плотность выбирает Windows; fm_Thin=100 - очень тонкий шрифт;

fm_ExtraLight=200 - очень светлый; fm_Light=300 - светлый;

fm_Normal=400 - нормальный; fm_Medium=500 - утолщенный;

fm_SemiBold=600 - полужирный; fm_Bcld=700 - жирный;

fm_ExtraBold=800 - усиленный; fm_Heavy=900 - тяжелый);

ifitalic, ifunderiine, ifStrikeOut - ненулевое значение означает соответственно наклонный, перечеркнутый и подчеркнутый шрифт;

IfCharSet - Набор символов (ANSI_CharSet=0, Default_CharSet=l;

Symbol_CharSet=2;ShiftJis_CharSet=128;OEM_CharSet=255);

ifoutprecision - точность представления шрифта; рекомендуется out__TT_prec (выбирает True Type и векторные шрифты, если есть несколько разновидностей одноименных шрифтов) или out_TT_oniy_prec (только True Type);

ifciipprecision - определяет точность отсечения надписи границами области прорисовки (Clip_Character_Precis, Clip_Embedded, Clip_Mask, Clip_TT_Always, Clip_Default_Precis - рекомендуется, Clip_LH_Angles, Clip_Stroke_Precis);

IfQuality - Определяет качество прорисовки (Default_Quality, Draft_Quality,Proof_Quality);

ifpitchAndFamily - в четырех младших разрядах указывается тип шрифта, в четырех старших ~ его семейство;

IfFaceName - имя гарнитуры шрифта.

Вот как реализован этот пример.

procedure TForm1.FormPaint(Sender:TObject) ;

var

X: Integer;

LF: TLogFont;

Fnt: HFont;

const

Text = 'Лучшая в мире система программирования';

begin

// Определяем параметры нового шрифта

FillChar(LF, SizeOf(LF), 0) ;

with LF do

begin

If Height := 20;

If Weight := fw_Normal;

If Underline := 1;

If Escapement := 450;

StrPCopy(lfFaceName, 'Courier New Cyr');

end;

with Forml.Canvas do

begin

// Создаем шрифт

Fnt := CreateFontIndirect(LF) ;

// Присваиваем его дескриптор шрифту канвы

Font.Handle := Fnt;

// Выводим текст под углом +45 градусов

Text0ut(0, 300, Text);

X := TextWidth(Text) ;

DeleteObject(Fnt); // Удаляем ненужный шрифт

// Изменяем параметры шрифта

with LF do

begin

If Height := 90;

IfEscapement := -900;

IfWeight := fw_Heavy;

StrPCopy(LF.lfFaceName, 'Arial Cyr');

end;

Fnt := CreateFontIndirect(LF); // Создаем новый шрифт

Font.Handle := Fnt;

Font.Color := clRed;

// Выводим с наклоном -90 градусов

TextOut(X-10, 10, 'Delphi 5');

DeleteObject(Fnt); // Удаляем ненужный шрифт

end;

end;

 

Параметр Format функции DrawText может содержать один или несколько следующих флагов.

Возможные значения параметра Format функции DrawText

dt Bottom

Текст прижимается к нижней части области Rect

dtCalcRect

Разрешает динамически изменять размеры области Rect

dtCenter

Текст центрируется по горизонтали

dtEditControl

 

 

 

 

Функция дублирует свойства отображения многострочного тестового редактора. В частности, таким же способом вычисляется средняя ширина символа и не показывается частично видимая последняя строка

dtExpandTabs

Символы табуляции заменяются пробелами

dt ExternalLeading

В высоту строки включается высота межстрочного интервала

dtLeft

Текст прижимается к левой части области Rect

dtNoClip

Текст не отсекается границами Rect

dtNoPrefix

Символы & не заменяются подчеркиванием

dtRight

Текст прижимается к правой части области Rect

dt SingleLine

Весь текст выводится единственной строкой, символы EOLN игнорируются

dt TabsStop

Символы табуляции не заменяются пробелами

dtTop

Текст прижимается к верхней части области R'ect

dtVCenter

Текст центрируется по вертикали

dtWordBreak

Разрешает переход на новую строку при достижении пра вой границы Rect; разрыв строки - на границе слова; символы EOLN также переводят вывод на следующую строку

Если установлен флаг dt_caicRect, функция изменяет высоту и ширину прямоугольника так, чтобы вывести весь текст, но сам текст не выводится. Если в тексте несколько строк, ширина вывода не меняется. Функция возвращает истинную высоту прямоугольника вывода.

Параметр options функции ExtTextOut может быть комбинацией следующих значений:

eto_Сlipped - текст будет отсекаться границами Rect;

eto_Gliph_index - блокирует обработку языковым драйвером;

eto_opaque - фон перерисовывается заново;

eto_RTLReading - вывод для чтения справа налево. При выводе текста стандартными методами rcanvas всегда заново прорисовывается фон символов (цвет фона возвращает функция GetBkColor). Если цвет фона символов отличается от фона канвы, вывод сопровождается неприятными побочными эффектами. Если в предыдущем примере для формы оставить стандартный цвет ciFaceBtn, окно вывода будет таким, как на рис. 16.6. Конечно, с помощью функции setBkcoior можно установить цвет формы совпадающим с цветом канвы, однако это не всегда возможно. Ясно, что установить переменный цвет функцией SetBkcoior невозможно. Более того, заглавные надписи программ Setup.exe также традиционно выводятся утолщенным наклонным шрифтом Times New Roman белыми буквами с черной тенью. Реализовать такой эффект достаточно просто: нужно вообще отказаться от прорисовки фона, установив с помощью функции SetBkMode режим Transparent, и вывести надпись дважды: первый раз черным цветом, а второй -белым, сместив вторую надпись немного влево и вверх относительно первой. Следующий листинг иллюстрирует сказанное.

procedure TFormI.FormPaint(Sender: TObject);

var

Y: Integer;

Blue: Byte;

const

Text = 'Фон для программы Setup.exe';

begin

with Forml.Canvas do

begin

for Y := 0 to Forml.Height-1 do

begin

// Уменьшаем интенсивность цвета с ростом ординаты Y

Blue := Round($FF*(Forml.Height-Y)/Forml.Height);

Pen.Color := RGB(0, 0, Blue); // Формируем цвет

MoveTo(0, Y); // Чертим линию

LineTo(Forml.Width-1, Y) ;

end; //for Y := 0 to Forml.Height-1 do Font.Size := 32;

Font.Style := [fsBold, fsltalic, fsUnderline];

Font.Name := 'Times New Roman";

// Это обращение накладывает текст на фон SetBkMode(Handle, Transparent);

// Сначала выводим тень надписи

Font.Color := clBlack;

Text0ut(40, 30, Text);

// Теперь саму надпись Font.Color := clWhite;

Text0ut(36, 26, Text)

end; //with Forml.Canvas do end;

Замечу, что любая заливка фона, в том числе его прорисовка, реализуется с помощью кисти. Поэтому отказаться от прорисовки фона текста можно, если установить стиль кисти bsciear: вместо

SetBkMode(Handle, Transparent);

можно использовать

Brush.Style := bsClear;

16.4.4.2. Области

К сожалению, в класс TCanvas не включена еще одна изобразительная возможность Windows - области (Regions). Области - такие же графические объекты, как перо, кисть, шрифт. Они образуются с помощью комбинации простейших геометрических фигур - прямоугольников, многоугольников, эллипсов. Замечательной особенностью областей является возможность создания с их помощью непрямоугольных кнопок, цветовых областей, окон. А вот как оно было создано:

uses

Forms,

Unit1 in 'Unitl.pas' {Formi}, Windows; // Этот модуль экспортирует функции API

{$R *.RES} var

Rgn: Cardinal;

begin

// Сначала создаем обычное окно:

Application.CreateForm(Tform1, Form1);

with Formi.Canvas, Formi do

begin

// Теперь создаем в нем эллиптическую область

Rgn := CreateEllipticRgn(0, 0, Width, Height);

// и показываем ее вместо окна

SetWindowRgn(Handle, Rgn, True);

end;

Application.Run;

end.

Ниже перечислены основные функции для работы с областями.

Работа с областями

function CombineRgn(DestRgn, Rgnl, Rgn2: Cardinal; Com-bineMode: Ineger): Integer;

Объединяет две области в одну: DestRgn - дескриптор результирующей области; Rgnl, Rgn2 -дескрипторы объединяемых областей; CombineMode - параметр, указывающий способ объединения; этот параметр, а также возвращаемое значение описаны ниже

function CreateEllipticRgn(XI, Yl, X2, Y2: Integer) : Cardinal;

Создает эллиптическую область

function CreatePoly-gonRgn(var Points; Count, PolyFillMode: Integer): Cardinal;

Создает область в виде многоугольника: Points - массив координат всех вершин многоугольника; Count - количество вершин; PolyFillMode -режим заполнения многоугольника (см. ниже)

function CreateRectRgn(XI,

Yl, X2, Y2: Integer): Cardi

nal;

Создает прямоугольную область

 

 

 

 

function CreateRoundRectRgn(Xl, Yl, X2, Y2, X3, Y3: Integer): Cardinal;

Создает область со скругленными углами; параметры обращения иллюстрирует

function EqualRgn(Rgnl,Rgn2: Cardibal): Bool;

Проверяет эквивалентность двух областей

function FillRgn(DC, Rgn,Brush: Cardinal): Bool;

Закрашивает область кистью: DC - дескриптор канвы окна; Rgn - дескриптор области; Brush - дескриптор кисти

function FrameRgn(DC, Rgn,Brush: Cardinal; Width,Height: Integer): Bool;

Обводит (но не заполняет) область кистью высотой Height и шириной Width пикселей

function InvertRgn(DC, Rgn:Cardinal): Bool;

Инвертирует все пиксели внутри области

function OffsetRgn(DC, Rgn:Cardinal; dX, dY: Integer):Integer;

Смещает область на dX по горизонтали и на dY по вертикали

function PaintRgn(DC, Rgn:Cardinal): Bool;

Закрашивает область текущей кистью 

 

function PtInRegion(Rgn:Cardinal; X, Y: Integer):Bool;

Проверяет принадлежность точки (X,Y) области Rgn 

function RectInRegion(Rgn:Cardinal; Rect: TRect):Bool;

Проверяет принадлежность прямоугольника Rect области Rgn 

 

function SetWindowRgn(DC,Rgn: Cardina; Redraw: Bool): Integer; 

 

 

Показывает принадлежащую окну с канвой DC область Rgn вместо окна; Redraw- разрешает/запрещает перерисовку области; все не вошедшие в область части окна не показываются (см. ниже)

Параметр combineMode в функции combineRgn может значения:

rgn_and - включает в результат общие части областей; rgn_copy -копирует область Rgnl В DestRgn; RGN_DIFF - исключает из Rgnl часть, принадлежащую Rgn2; rgn_or - объединяет области; rgn_xor -включает в результат только те части областей, которые не принадлежат им одновременно. Область DestRgn уже должна существовать и иметь размеры, достаточные для размещения объединенной области. При обращении к функции createPoiygonRgn параметр Poly FillMode может иметь значения: Alternate И Winding. В первом случае заполнение многоугольника идет последовательно между двумя близлежащими его сторонами: сначала между 1-й и 2-й, затем между 2-й и 3-й и т. д. В режиме winding заполняется все внутреннее пространство области.

Во всех случаях Windows автоматически проводит линию между последней и первой точкой многоугольника, делая его замкнутым.

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;

tуре

Tform1 = class(TForm)

PaintBoxl: TPaintBox;

PaintBox2: TPaintBox;

Button1: TButton;

procedure ButtonlClick(Sender: TObject);

private

{ Private declarations } public

{ Public declarations } end;

var

Form1: Tform1;

implernentation

$R *.DFM)

procedure TFormI.ButtonlClick(Sender: TObject);

var

Rgnl, Rgn2: Cardinal;

const

Points: array [1..5, 1..2] of Integer =

C(91, 0), (160, 183), (0, 70), (183, 70), (23, 183));

begin

Rgn1 := CreatePolygonRgn(Points, 5, Alternate);

Rgn2 := CreatePolygonRgn(Points, 5, Winding);

with PaintBoxl.Canvas do begin

Brush.Color := clBlack;

FillRgn(Handle, Rgnl, Brush.Handle);

end;

with PaintBox2.Canvas do begin

Brush.Color := clBlack;

FillRgn(Handle, Rgn2, Brush.Handle) ;

end;

end;

end.

Обратите внимание: прорисовка и объединение областей доступны, только если области видны в окне (для создания предыдущего рисунка нельзя, например, использовать обработчик формы OnActivate).

Функция SetWindowRgn, как уже отмечалось, поручает прорисовку окна самой Windows, при этом фактически прорисовывается не область, а лишь та часть окна, которая ограничена ею. Любые заливки области, ее очерчивание и объединение с другими областями игнорируются.

16.4.5. Классы TGraphic и TPicture

Важное место в графическом инструментарии Delphi занимают классы TGraphic и TPicture.

TGraphic - это абстрактный класс, инкапсулирующий общие свойства и методы трех своих потомков: пиктограммы (TIcon), метафайла (TMetafile) и растрового изображения (TBitmap). Общей особенностью потомков TGraphic является то, что обычно они сохраняются в файлах определенного формата. Пиктограммы представляют собой небольшие растровые изображения, снабженные специальными средствами, регулирующими их прозрачность. Для файлов пиктограмм обычно используется расширение ico. Метафайл - это изображение, построенное на графическом устройстве с помощью специальных команд, которые сохраняются в файле с расширением wmf или emf. Растровые изображения - это произвольные графические изображения в файлах со стандартным расширением bmp.

Свойства класса TGraphic:

property Empty: Boolean;

Содержит True, если с объектом не связано графическое изображение

property Height: Integer;

Содержит высоту изображения в пикселях

property Modified: Boolean;

Содержит True, если графический объект изменялся

property Palette: HPALETTE;

Содержит цветовую палитру графического объекта

property PaletteModified: Boolean;

Содержит True, если менялась цветовая палитра графического объекта

property Transparent: Boolean;

Содержит True, если объект прозрачен для фона, на котором он изображен

property Width: Integer;

Содержит ширину изображения в пикселях

Методы Класса TGraphic:

 procedure LoadFromClipooardFormat (AFormat: Word;AData: THandle; APalette:HPALETTE) ; 

 

Ищет в буфере межпрограммного обмена Clipboard зарегистрированный формат AFormat и, если формат найден, загружает из буфера изображение AData и его палитру Apalette

procedure LoadFromrile(const FileName:String) ;

Загружает изображение из файла FileName 

procedure LoadFromStream(Stream: TStream);

Загружает изображение из потока данных Stream

procedure SaveToClipboardFormat (var AFormat: Word;var AData: THandle; varAPalette: HPALETTE);

Помещает графическое изображение Adata и его цветовую палитру APalette в буфер межпрограммного обмена в формате Af ormat

procedure SaveToFile(constFileName: Strings;

Сохраняет изображение в файле FileName  

procedure SavePoStream(Stream: TStream);

Сохраняет изображение в потоке Stream

Полнофункциональный класс TPicture инкапсулирует в себе все необходимое для работы с готовыми графическими изображениями - пиктограммой, растром или метафайлом. Его свойство Graphic может содержать объект любого из этих типов, обеспечивая нужный полиморфизм методов класса.

Свойства класса TPicture:

property Bitmap: TBitmap;

Интерпретирует графический объект как растровое изображение

property Graphic: TGraphic;

Содержит графический объект

property Height: Integer;

Содержит высоту изображения в пикселях

property Icon: TIcon;

Интерпретирует графический объект как пиктограмму

property Metafile: TMetafile;

Интерпретирует графический объект как метафайл

property width: Integer;

Содержит ширину изображения в пикселях

Методы класса TPicture:

procedure Assign(Source: TPersistent) ;

Связывает собственный графический объект Graphic с объектом Source

procedure LoadFromClipboardFormat

(AFormat: Word;AData: THandle;

APalette:HPALETTE) ; 

Ищет в буфере межпрограммного обмена Clipboard зарегистрированный формат AFormat и, если формат найден, загружает из буфера изображение AData и его палитру APalette

procedure LoadFromFile(const FileName:String);

Загружает изображение из файла FileName 

class procedure Register; ClipboardFormat(AFormat:

Word; AGraphicClass: TGraphicClass) ;

Используется для регистрации в Clipboard

нового формата изображения

 

 

class procedure Register; FileFormat (const AExtension, ADescription: String; AGraphicClass: Tgraphic Class) ;

Используется для регистрации нового файлового формата

 

class procedure RegisterFileFormatRes(const AExtension: String; ADescriptionResID: Integer; Agraphic Class: TGraphicClass);

Используется для регистрации нового формата ресурсного файла  

procedure SaveToClipboardFormat (var AFormat: Word; var AData: THandle; varAPalette: HPALETTE);

Помещает графическое изображение AData и его цветовую палитру APalette в буфер межпрограммного обмена в формате AFormat

procedure SaveToFile(const

FileName: Strings;

Сохраняет изображение в файле FileName

 

 

class function SupportsClipboardFormat(AFormat: Word): Boolean;

Возвращает True, если формат Aformat зарегистрирован в буфере межпрограммного обмена Clipboard  

class procedure UnregisterGraphicClass(AClass:TGraphicClass);

Делает недоступными любые графические объекты класса Aclass