- •Средства визуального программирования
- •090105 «Комплексное обеспечение информационной безопасности
- •Ставрополь, 2010 Содержание
- •Введение
- •Задачи дисциплины – дать основы:
- •В результате изучения дисциплины студенты должны
- •1.1. Версия 1
- •1.2. Версия 2
- •1.3. Версия 3
- •1.4. Версия 4
- •1.5. Версия 5
- •1.6. Версия 6
- •2.1. Главное окно
- •2.2. Окно формы
- •2.3. Окно дерева объектов
- •2.4. Окно инспектора объектов
- •2.5. Окно кода программы
- •3.1. Пустая форма и ее модификация
- •3.2. Размещение нового компонента
- •3.3. Реакция на события
- •3.4. Некоторые итоги
- •4.1. Страница standard
- •4.2. Страница additional
- •4.3. Страница win32
- •4.4. Страница system
- •4.5. Страница dialogs
- •4.6. Страница win31
- •4.7. Страница samples
- •4.8. Компоненты для работы с базами данных
- •4.9. Компоненты для доступа к интернет
- •4.10. Доступ к серверам автоматизации
- •5.1. Учебная программа
- •5.2. Структура программ delphi
- •5.3. Типы
- •5.4. Операторы языка
- •5.5. Массивы
- •5.6. Процедуры и функции
- •6.1. Алфавит
- •6.2. Идентификаторы
- •6.3. Константы
- •6.4. Выражения
- •6.5. Операции
- •7.1. Простые типы
- •7.2. Структурированные типы
- •7.3. Строки
- •7.4. Указатели и динамическая память
- •7.5. Псевдонимы типов
- •8.1. Локализация имен
- •8.2. Описание подпрограммы
- •8.3. Параметры-массивы и параметры-строки
- •8.4. Процедурные типы
- •8.5. Рекурсия и опережающее описание
- •9.1. Основные понятия
- •9.2. Составляющие класса
- •9.3. Объявление класса
- •9.4. Интерфейсы
- •10.1. Основные свойства варианта
- •10.2. Преобразование вариантов к данным других типов
- •10.3. Подпрограммы для работы с вариантами
- •10.4. Вариантные массивы
- •10.5. Пользовательские варианты
- •11.1. Доступ к файлам
- •11.2. Процедуры и функции для работы с файлами
- •11.3. Текстовые файлы
- •11.4. Типизированные файлы
- •11.5. Нетипизированные файлы
- •11.6. Средства windows для работы с файлами
- •11.7. Отображение файлов в память
- •11.7.1. Создание/открытие файла
- •11.8. Объектная модель работы с файлами
- •12.1. Структура модулей
- •12.2. Заголовок модуля и связь модулей друг с другом
- •12.3. Интерфейсная часть
- •12.4. Исполняемая часть
- •12.5. Инициирующая и завершающая части
- •12.6. Доступ к объявленным в модуле объектам
- •12.7. Типы модулей в delphi
- •13.1. Назначение
- •13.2. Реализация
- •13.3. Пример
- •13.4. Использование
- •13.5. Включение в библиотеку форм
- •15.1. Константы простых типов и типа string
- •15.2. Константы-массивы
- •15.3. Константы-записи
- •15.4. Константы-множества
- •15.5. Константы-указатели
- •15.6. Инициация переменных
- •16.1. Класс exception - обработка исключений
- •16.2. Класс tlist - списки
- •16.3. Классы tstrings и tstringlist -наборы строк и объектов
- •16.4. Графический инструментарий
- •Список используемой литературы
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 |