Большой архив статей, книг, документации по программированию, вебдизайну, компьютерной графике, сетям, операционным системам и многому другому
 
<Добавить в Избранное>    <Сделать стартовой>    <Реклама на сайте>    <Контакты>
  Главная Документация Новости ИТ Программы Книги Games   Обои   Экспорт RSS E-Books
 
Поиск по сайту

TOP-10 программ
Symantec Norton Ghost 9.0
Partition Magic 8.0.2 Pro
Xilisoft 3GP Video Converter v3.1.7.0616b
Norton AntiVirus 2005
Xilisoft 3GP Video Converter v2.1.52.831b
Антивирус Касперского Personal 5.0.303 beta 2
RAR Password Cracker 4.12
ABBYY PDF Transformer v1.00.820
MP3 To Ringtone Gold v3.02
Mobtime Cell Phone Manager v5.3.1
 
Наши сервисы
Рассылка новостей. Подпишитесь на рассылку сейчас и вы всегда будете в курсе последних событий в мире информационных технологий.
Новостные информеры. Поставьте наши информеры к себе и у вас на сайте появится дополнительный постоянно обновляемый раздел.
Добавление статей. Если вы являетесь автором статьи или обзора на тему ИТ присылайте материал нам, мы с удовольствием опубликуем его у себя на сайте.
 
 

  Раздел: Компьютерная документация -> Программирование -> Delphi / Pascal

 

Области и API-функции работы с ними

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

Для создания нестандартного окна нужно лишь немного изменить файл проекта. Следующий пример делает форму эллиптической (привожу файл проекта полностью):

program Project1;

Uses

Forms,
Unit1 in 'Unit1.pas' {Form1},
Windows; // добавляем сами (функции API)

{$R *.RES}

var
  Region: Cardinal; // добавляем переменную
Begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  // добавляем в стандартный файл проекта несколько строк:
  with Form1.Canvas, Form1 do
    begin
      Region := CreateEllipticRgn(0, 0, Width, Height);
      SetWindowRgn(Handle, Region, True);
    end;
  Application.Run;
end.

Как видно, мы добавили вызов двух функций API: CreateEllipticRgn и SetWindowRgn. Эти функции будут описаны ниже.

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

procedure TForm1.Button1Click(Sender: TObject);
var
  Region: Cardinal;
begin
  with Button1 do
    begin
      Region := CreateRoundRectRgn(0, 0, Width, Height, 20, 20);
      SetWindowRgn(Handle, Region, True);
    end;
end;

Запустите проект и щелкните по кнопке. В результате кнопка станет скругленной по углам. Скругление углов производит функция CreateRoundRectRgn.

Ниже в таблице приведены описания функций API по созданию областей различной формы:

function CreateEllipticRgn(X1, Y1, X2, Y2: Integer) : Cardinal; Создает эллиптическую область. X1 - координата по горизонтали верхнего левого угла ограничивающего прямоугольника; Y1 - координата по вертикали верхнего левого угла ограничивающего прямоугольника; X2 и Y2 – аналогично для нижнего правого угла ограничивающего прямоугольника.
function CreateRoundRectRgn(X1, Y1, X2, Y2, H, W: Integer): Cardinal; Создает область "прямоугольник со скругленными углами".
X1 - координата по горизонтали верхнего левого угла области;
Y1 - координата по вертикали верхнего левого угла области;
X2 и Y2 – аналогично для нижнего правого угла области;
H - высота эллипса для скругленных углов;
W - ширина эллипса для скругленных углов.
function CreatePolygonRgn(Const Points; Count, PolyFillMode: Integer): Cardinal; Создает область в виде многоугольника.
Points – двумерный массив координат всех вершин многоугольника или массив TPoint этих вершин;
Count - количество вершин;
PolyFillMode -режим заполнения многоугольника. PolyFillMode может иметь значения: ALTERNATE и WINDING. В режиме ALTERNATE заполнение многоугольника идет последовательно между двумя близлежащими его сторонами: сначала между 1-й и 2-й, затем между 2-й и 3-й и т. д. В режиме WINDING заполняется все внутреннее пространство области. Во всех случаях автоматически соединяются последняя и первая точки.
function CreateRectRgn(X1, Y1, X2, Y2: Integer): Cardinal; Создает область в виде прямоугольника.
X1 - координата по горизонтали верхнего левого угла прямоугольника;
Y1 - координата по вертикали верхнего левого угла прямоугольника;
X2 и Y2 – аналогично для нижнего правого угла прямоугольника.

Следующая, упоминавшаяся в примерах функция – SetWindowRgn – имеет следующее описание:

function SetWindowRgn (DC, Rgn: Cardinal; Redraw: Bool): Integer;
Выводит принадлежащую окну с канвой DC область Rgn вместо окна; Redraw- разрешает (True) / запрещает (False) перерисовку области; все не вошедшие в область части окна не показываются. Любые заливки области, ее очерчивание и объединение с другими областями игнорируются.

В следующей таблице приводятся дополнительные функции API по работе с областями:

function CombineRgn(DestRgn, Rgn1, Rgn2: Cardinal; CombineMode: Ineger): Integer; Объединяет две области в одну.
DestRgn - дескриптор результирующей области;
Rgn1, Rgn2 - дескрипторы объединяемых областей;
CombineMode - параметр, указывающий способ объединения. Параметр CombineMode может иметь следующие значения:   RGN_AND - включает в результат общие части областей;
  RGN_COPY - копирует область Rgn1 в DestRgn;
  RGN_DIFF - исключает из Rgn1 часть, принадлежащую Rgn2;
  RGN_OR - объединяет области;
  RGN_XOR - включает в результат только те части областей, которые не принадлежат им одновременно.
До применения функции область DestRgn уже должна существовать и иметь размеры, достаточные для размещения объединенной области.
function EqualRgn(Rgn1,Rgn2: Cardinal): Bool; Проверяет эквивалентность двух областей.
Rgn1, Rgn2 – дескрипторы сравниваемых областей.
function FillRgn(DC, Rgn,Brush: Cardinal): Bool; Закрашивает область кистью.
DC - дескриптор канвы окна;
Rgn - дескриптор области;
Brush - дескриптор кисти.
function FrameRgn(DC, Rgn,Brush: Cardinal; Width,Height: Integer): Bool; Обводит область кистью высотой Height и шириной Width пикселей.
DC - дескриптор канвы окна;
Rgn - дескриптор области;
Brush - дескриптор кисти.
function InvertRgn(DC, Rgn:Cardinal): Bool; Инвертирует цвет всех точек внутри области.
DC - дескриптор канвы окна;
Rgn - дескриптор области.
function OffsetRgn(DC, Rgn:Cardinal; dX, dY: Integer):Integer; Смещает область на dX по горизонтали и на dY по вертикали.
DC - дескриптор канвы окна;
Rgn - дескриптор области.
function PaintRgn(DC, Rgn:Cardinal): Bool; Закрашивает область текущей кистью.
DC - дескриптор канвы окна;
Rgn - дескриптор области.
function PtInRegion(Rgn:Cardinal; X, Y: Integer):Bool; Проверяет принадлежность точки (X,Y) области с дескриптором Rgn.
function RectInRegion(Rgn:Cardinal; Rect: TRect):Bool; Проверяет принадлежность прямоугольника Rect области с дескриптором Rgn.

Данная статья призвана восполнить недостающие возможности класса TCanvas среды Delphi по работе с областями. В классе TCanvas недостает некоторых возможностей Windows и по выводу текста, в частности, отсутствуют возможности вывода вертикального текста и текста под произвольным углом. Попытку восполнить этот пробел я сделал в другой моей статье – Вывод текста средствами API.

Автор: Андрей Садовой
Источник: www.delphiplus.org

Ссылки по теме
Алгоритмы Сортировки. Часть 1
Введение в Delphi 8
Работа с реестром в Delphi
Delphi и ресурсы компьютера
Советы начинающим программировать на Delphi
Структуры и базы данных, методы сортировки

Вся документация Pascal и Delphi

 

Компьютерная документация от А до Я - Главная

 
Популярные книги

Технология программирования на C++. Начальный курс

Подробнее

Photoshop CS2. Настоящий самоучитель

Подробнее

SQL для "чайников", 5-е издание

Подробнее

 

 
Новости ИТ
01.12.2008  Buffalo выпустил миниатюрные USB-накопители
01.12.2008  VENTO TA-U1 - стильный корпус представлен Asus
01.12.2008  Fujitsu-Siemens выпускает в продажу внешний ускоритель для ноутбуков
01.12.2008  Оригинальные чехлы для ноутбуков от Choiix
01.12.2008  Опубликован код драйвера для беспроводных карт Atheros
01.12.2008  Лучший блог 2008
01.12.2008  Linux запустили на Apple iPhone
01.12.2008  LG KC780
01.12.2008  MSI дополнит линейку Wind-нетбуков двумя моделями
01.12.2008  Nikon D3X - 24,5 млн пикселей для профессионалов
01.12.2008  Киловаттник HIPER M1000 с КПД выше 85%
01.12.2008  AMD впервые снизила цены линейки Radeon HD 4800
01.12.2008  Чистильщики: Wise Registry Cleaner v.3.8.2
01.12.2008  Антивирусы: RemoveIT Pro v4 SE (30.11.2008)
01.12.2008  Корпус ASUS Vento TA-U1 можно поставить вместо новогодней ёлки
01.12.2008  Диагностика: PC Wizard 2008 v.1.871
01.12.2008  Диагностика: NextSensor v.2.7.6.0 Build 1130
01.12.2008  Тестовые приложения: PassMark BurnInTest v.6.0 Build 1000 Beta 15
01.12.2008  Неофициальные драйверы для модемов Motorola
01.12.2008  Драйверы и утилиты для сетевых хранилищ D-Link
 
Полезно

 
Copyright © CompDoc.Ru
При цитировании и перепечатке ссылка на www.compdoc.ru обязательна. Карта сайта.
 
Rambler's Top100