TRect — Тип Delphi


Содержание

TRect — Тип Delphi

Ранше мне не прихолидось работать с PRect. Я знаю TRect помогите разобратся.

Был бы вопрос чуть подробнее, ответ был бы более точным

var R: TRect;
.
SomeFunct(@R); // Передача в функцию параметра типа PRect

PRect — это просто указатель на TRect.
Вот на пример:

var
Rect : TRect;
Temp : PREct;
begin
Rect.Top := 10;
Rect.Left := 10;
Rect.Bottom := 100;
Rect.Right := 100;
Temp := @Rect;
Label1.Caption := IntToStr(Temp.Left);
Temp.Left := 20;
Rect := Temp^;
Label2.Caption := IntToStr(Rect.Left);
end;

Спасибо всем работает.
Дело было вот вчём ClipCursor(PRect).

How to compare two TRect variables in D7?

How can I compare two variables of TRect type?

With that above I get: Incompatible types.

1 Answer 1

If you had a modern Delphi, then that code would compile and work. The TRect in modern Delphi versions takes advantage of operator overloading to overload the equality operator. You simply cannot make that syntax work in Delphi 7 since there is no built in equality operator for Delphi records.

Without that help from the compiler you need a helper function. You can write your own:

Although, as @Sertac points out, there’s little need to write your own EqualRect when you can use the Windows API function of the same name.

Not the answer you’re looking for? Browse other questions tagged delphi delphi-7 or ask your own question.

Hot Network Questions

Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

site design / logo © 2020 Stack Exchange Inc; user contributions licensed under cc by-sa 4.0 with attribution required. rev 2020.11.11.35402

Справочник по компонентам Delphi. Часть 1

Written on 15 Сентября 2006 . Posted in Delphi

ОГЛАВЛЕНИЕ

Класс TCanvas

Этот класс — сердцевина графической подсистемы Delphi. Он объединяет в себе и «холст» (контекст конкретного устройства GDI), и «рабочие инстру­менты» (перо, кисть, шрифт) и даже «подмастерьев» (набор функций по рисованию типовых геометрических фигур).

В дальнейшем для обозначения этого класса мы будем пользоваться термином «канва». Сознавая неоднозначность такого перевода, авторы тем не менее считают, что у него наилучшие шансы прижиться.

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

Дескриптор контекста устройства, над которьм «построена» канва, может быть востребован для различных низкоуровневых операций. Он задается свой­ством:

Для рисования канва включает в себя шрифт, перо и кисть:

Кроме того, можно рисовать и поточечно, получив доступ к каждому пикселу. Значение свойства

соответствует цвету точки с координатами (X,Y).

Канва содержит методы-надстройки над всеми основными функциями рисования GDI Windows и свойства, которые приведены ниже в таблице. При их рассмотрении имейте в виду, что все геометрические фигуры рисуются текущим пером. Те из них, которые можно закрашивать, закрашиваются с помощью текущей кисти. Кисть и перо при этом имеют текущий цвет.

procedure Arc (XI, Yl, Х2, Y2, ХЗ, Y3, Х4, Y4: Integer) ; Метод рисует сегмент эллипса. Эллипс определяется описывающим прямоуголь­ником (X1,Y1) — (X2,Y2); его размеры должны лежать в диапазоне от 2 до 32767 точек. Начальная точка сегмента лежит на пересечении эллипса и луча, проведенного из его центра через точку (X3.Y3). Конечная точка сегмента лежит на пересечении эллипса и луча, проведенного из его центра через точку (X4.Y4). Сегмент рисуется против часовой стрелки.
procedure Chord(Xl, Yl, Х2, Y2, ХЗ, Y3, Х4, Y4: Integer); Рисует хорду и заливает отсекаемую ею часть эллипса. Эллипс, начальная и конеч­ная точки определяются, как в методе Arc.
procedure EllipsefXl, Yl, Х2, Y2: Integer) ; Рисует и закрашивает эллипс, вписанный в прямоугольник (X1.Y1) — (X2.Y2).
procedure LineTo(X, Y: Integer); Проводит линию текущим пером из текущей точки в (X,Y).
procedure MoveTo(X, Y: Integer); Перемещает текущее положение пера (свойство PenPos) в точку (X,Y).
procedure BrushCopy(const Dest: TRect; Bitmap: TBitmap; const Source: TRect; Color: TColor); Производит специальное копирование. Прямоугольник Source из битовой карты Bitmap копируется в прямоугольник Dest на канве; при этом цвет Color заменяется на цвет текущей кисти (Brush.Color). С помощью этого метода можно нарисо­вать «прозрачную» картинку. Для этого нужно выбрать соответствующий фону цвет кисти и затем заменить на него фоновый или наиболее часто встреча­ющийся цвет битовой карты (см. Bitmap. TransparentColor).
procedure CopyRect(const Dest: TRect; Canvas: TCanvas; const Source: TRect) ; Производит копирование прямоугольника Source из канвы Canvas в прямоугольник Dest в области самого объекта.
procedure FillRect(const Rect: TRect) ; Производит заливку прямоугольника (текущей кистью).
procedure FrameRectfconst Rect: TRect); Производит оконтуривание прямоуголь­ника цветом текущей кисти (без заполнения).
procedure Draw(X, Y: Integer; Graphic: TGraphic) ; Осуществляет рисование графического объекта Graphic (точнее, вызов метода его рисования) в области с верхним левым углом (X,Y).
procedure StretchDraw(const Rect: TRect; Graphic: TGraphic); Осуществляет рисование объекта Graphic в заданном прямоугольнике Rect. Если размеры их не совпадают, Graphic масштабируется.
procedure DrawFocusRect(const Rect: TRect); Производит отрисовку прямоугольной рамки из точек (как на элементе, имеющем фокус ввода). Поскольку метод использует логическую операцию XOR (исключающее ИЛИ), повторный вызов для того же прямоугольника приводит изображение к начальному виду.
procedure FloodFilKX, Y: Integer; Color: TColor; FillStyle: TFillStyle); TFillStyle = (fsSurface, fsBorder) ; Производит заливку области текущей кистью. Процесс начинается с точки (X,Y). Если режим FillStyle равен fsSurface, то он продолжается до тех пор, пока есть соседние точки с цветом Color. В режиме fsBorder закрашивание, наоборот, прекращается при выходе на границу с цветом Color.
procedure Pie (XI, Yl, Х2, Y2, ХЗ, Y3, Х4, Y4: Integers- Рисует сектор эллипса, описываемого прямоугольником (X1,Y1) — (X2,Y2). Стороны сектора лежат на лучах, проходящих из центра эллипса через точки (X3.Y3) и (X4,Y4).
procedure Polygon(const Points: array of TPoint) ; Строит многоугольник, используя массив координат точек Points. При этом последняя точка соединяется с первой и внутренняя область закрашивается.
procedure Polyline(const Points: array of TPoint) ; Строит ломаную линию, используя массив координат точек Points.
procedure Rectangle(XI, Yl, Х2, Y2 : Integer) ; Рисует прямоугольник с верхним левым углом в (XI ,Y1) и нижним правым в (X2.Y2).
procedure RoundRect (XI, Yl, Х2, Y2, ХЗ, Y3: Integer); Рисует прямоугольник с закругленными углами. Координаты вершин — те же, что и в методе Rectangle. Закругления рисуются как сегменты эллипса с размерами осей по горизонтали и вертикали ХЗ и Y3.
function. TextHeight(const Text: string): Integer; Возвращает высоту строки Text в пикселах.
function TextWidth(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: stringi ; Производит вывод текста с отсечением. Как и в TextOut, строка Text выводится с позиции (X,Y); при этом часть текста, лежащая вне пределов прямоугольника Rect, отсекается и не будет видна.
(Ro) property ClipRect: TRect; Определяет область отсечения канвы. То, что при рисовании попадает за пределы этого прямоугольника, не будет изображено. Свойство доступно только для чтения — его значение переустанавливается системой в контексте устройства канвы.
property PenPos: TPoint; Содержит текущую позицию пера канвы (изменяется посредством метода MoveTo).

сбрасывает текущие шрифт, перо и кисть, заменяя их на стандартные, заимство­ванные из Windows (BLACK.PEN, HOLLOW_BRUSH, SYSTEM.FONT).

Предусмотрено два события для пользовательской реакции на изменение канвы:

Эти события возникают при изменениях свойств и вызовах методов TCanvas, меняющих вид канвы (то есть при любом рисовании. В MoveTo, например, они не возникают). Отличие их в том, что OnChanging вызывается до начала изменений, a OnChange — после их завершения.

Идентификатор (код) растровой операции при копировании прямоугольных блоков содержится в свойстве

и определяет правило сочетания пикселов, копируемых на канву, с ее текущим содержимым. При этом можно создавать разные изобразительные эффекты. В Delphi определены следующие константы кодов: cmBlackness, cmDstInvert, cmMergeCopy, cmMergePaint, cmNotSrcCopy, cmNotSrcErase, cmPatCopy, cmPatInvert, cmPatPaint, cmSrcAnd, cmSrcCopy, cmSrcErase, cmSrcInvert, cmSrcPaint, cmWhiteness.

Все они стандартно определены в Windows, и подробное их описание можно найти в документации по GDI. Значением CopyMode по умолчанию является cmSrcCopy — копирование пикселов источника поверх существующих.

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

Клуб программистов

Delphi programming

Подписаться на рассылку:

создаёт величину TRect с указанием 2 точек или 4 координат

1 function Rect ( Left, Top, Right, Bottom : Integer ) : TRect;

2 function Rect ( TopLeft, BottomRight : TPoint ) : TRect;

Описание:

Delphi функция Rect создает объект TRect (прямоугольник), для создания прямоугольника необходимо указать 4 числа — координат или 2 точки.

При создании с указанием двух точек TopLeft и BottomRight, вы можете передать две величины TPoint или использовать функцию Point.

Пример кода:

var
rectangle1, rectangle2 : TRect;

begin
// Set up the first rectangle using syntax 1
rectangle1 := Rect(20, 40, 60, 80);

// Set up the second rectangle using the Rect function
rectangle2 := Classes.Rect(Point(20, 40), Point(60, 80));

// Display the top left and bottom right coords of each rectangle
ShowMessageFmt(‘Rectangle 1 coords = %d,%d,%d,%d’,
[rectangle1.Left,
rectangle1.Top,
rectangle1.Right,
rectangle1.Bottom]);
ShowMessageFmt(‘Rectangle 2 coords = %d,%d,%d,%d’,
[rectangle2.Left,
rectangle2.Top,
rectangle2.Right,
rectangle2.Bottom]);
end;

Результат выполнения:

Rectangle 1 coords = 20,40,60,80
Rectangle 2 coords = 20,40,60,80

Массивы в Delphi (структурные типы данных)

Массивом называется упорядоченная индексированная совокупность однотипных элементов, имеющих общее имя. Элементами массива могут быть данные различных типов, включая структурированные. Каждый элемент массива однозначно определяется именем массива и индексом (номером этого элемента в массиве) или индексами, если массив многомерный. Для обращения к отдельному элементу массива указываются имя этого массива и индекс (индексы) элемента, заключенный в квадратные скобки, например, arr1 [3, 35], arr1 [3] [35] или аrr3 [7].

Количество индексных позиций определяется размерностью массива (одномерный, двумерный и т. д.), при этом размерность не ограничивается. В математике аналогом одномерного массива является вектор, а двумерного— матрица. Индексы элементов массива должны принадлежать порядковому типу. Разные индексы одного и того же массива могут иметь различные типы. Чаще всего индекс имеет целочисленный тип.

Различают массивы статические и динамические.

Статический массив

Статический массив представляет собой массив, границы индексов и, соответственно, размеры которого задаются при объявлении, т. е. они известны еще до компиляции программы. Формат описания типа статического массива:

Лучшие IT-решения для бизнеса

Код-Эксперт

  • Автоматизация бизнес процессов
  • Сопровождение 1С
  • Разработка любой сложности, на платформе 1С
  • Создание и продвижение сайтов
  • Софт и ПК для вашей компании

Как мы работаем

1. Обсуждаем проблему по телефону. При наличии удаленного доступа — показываете на экране вашего компьютера.

2. Мы оцениваем работу в рублях, если проект большой, если нет — примерное кол-во часов.

3. Мы выполняем работу.

4. Вы принимаете работу в вашей программе, если есть недочеты мы их исправляем.

5. Мы выставляем счет, вы оплачиваете.

Стоимость работ

1. Все работы делятся на 3 категории: консультация, обновление типовой конфигурации, разработка или программирование нового отчета, обработки, кнопки и т.п.

2. Стоимость работ по категориям:

Услуга Цена Минимальный объем работ
Консультации 900 р/час 1 час, далее по 20 мин.
Обновления 1100 р/час 1 база
Программирование 1400 р/час 1 час, далее по 20 мин.

3. На работы более 10 часов предварительно составляется техническое задание с описанием и стоимостью работ. Работы начинаются после согласования ТЗ с вами.

Техническая поддержка

1. Если вы обнаруживаете какие то ошибки, в ранее принятых работах, в течении 3х месяцев, мы исправляем их бесплатно.

2. Постоянным клиентам любые недочеты, допущенные в наших работах, исправляем бесплатно в течении года.

Программы для управления вашим бизнесом. Продажа 1С.

Мы являемся официальным дилером фирмы 1С, вы можете приобрести у нас различные программные продукты и лицензии. Кроме покупки «коробки» мы поможем вам настроить программу, проконсультируем и сделаем базовые настройки.

  • Автоматизация продаж
  • Бухгалтерский учет
  • Множество других направлений.
  • Помощь в установке и настройке.
  • Тонкая настройка конфигураций под нужды заказчика, разработка новых модулей при отсутствии необходимых функций в стандартной конфигурации.

SMS из вашей 1С

Хотите чтобы клиенты во время узнавали об акциях, скидках? Клиенты не возвращаются? Настройте отправку SMS прямо из 1С!

Наша компания сможет в короткие сроки настроить отправку SMS Вашим клиентам напрямую из 1С. Примеры событий которые можно автоматизировать:

  • Благодарность за покупку и начисление бонусов сразу после очередной покупки.
  • Начисление бонусов на карту в подарок на день рождения\к другому знаменательному или праздничному дню.
  • Извещение о поступлении товара на склад.
  • Истечение срока подарочных бонусов.
  • Извещение о поступлении предоплаты и резервирования товара.
  • Адрес с уточнениями проезда к магазину\офису, номера телефонов.
  • И т.п.

Настройку в 1С можно произвести силами наших специалистов или своих сотрудников. Ознакомится с тарифами можно на странице SMS-тарифов.

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

DelphiComponent.ru — бесплатно видеоуроки по Delphi, статьи, исходники

Методы объекта Delphi TCanvas: Pixels

TextW >Следующий метод объекта TCanvas — это Arc, который предназначен для рисо­вания дуги. У него 8 параметров: x1, y1, x2, y2, хз, y3, x4, y4. Как видите, это 4 па­ры координат х и y, которые указывают 4 точки, через которые надо провести дугу.

Copy Rect

Этот метод предназначен для копирования указанного прямоугольника из одно­го объекта TCanvas в другой. У метода три параметра:

  • Dest: TRect — область, указывающая, куда надо копировать;
  • canvas: TCanvas — объект, из которого надо копировать;
  • source: TRect — область, указывающая, откуда надо копировать.

Первый и последний параметры имеют тип TRect. Это простая структура из че­тырех целых чисел— Left, тор, Right, Bottom. Не трудно догадаться, что это координаты прямоугольника. Для создания переменной такого типа лучше всего использовать функцию Rect. Ей нужно передать четыре этих параметра Left, тор, Right, Bottom, и она вернет вам готовую структуру.

Давайте рассмотрим пример и увидим все на практике. Допустим, у нас есть две формы. Мы хотим из второй формы Form2 скопировать все ее содержимое в пер­вую форму Forml. При этом отобразим содержимое второй формы на первой в прямоугольнике размером (10, 10, 110, 110).

Программный код, выполняющий эти действия, будет выглядеть так:

SRect, DRect: TRect;// Объявляю две переменные типа TRect

SRect: =Rect (0, 0, Form2. Width, Form2 . Height) ;

DRect:=Rect(10, 10, 110, 110);

Forml.Canvas1.CopyRect(DRect, Form2.Canvas, SRect);

В первой строке мы заполняем структуру SRect с помощью функции Rect. При этом указываем полные координаты окна Form2 т. е. (0, о, ширина второй формы, Высота второй формы).

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

В этом случае код займет 4 строки, а это уже недостаток. Лучше все записать одной строкой. Чем проще пишете, тем легче потом воспринимается код.

И последнее— мы копируем холст второй формы в первую. Сразу надо заме­тить, что если размер области источника больше приемника, то область будет рас­тянута или сжата до размеров приемника. Таким образом, если размеры второй формы больше чем 100×100 (именно в такой квадрат на форме 1 мы хотим скопи­ровать вторую форму), то изображение второй формы будет сжато до размеров 100×100.

Иногда можно столкнуться с проблемой, когда в функции уже есть переменная или другая функция с именем Rect. Уж слишком простое имя и в самом VCL ис­пользуется для решения разных задач, поэтому и возникают проблемы. В этом слу­чае компилятор Delphi может запутаться и не сможет определить, что именно вы хотите сейчас использовать. Чтобы помочь компилятору, можно написать перед именем функции имя модуля, где описана функция, например:

Этот метод тоже предназначен для копирования изображений, но другого фор­мата. У него три параметра: х и y— координаты, куда копировать; объект типа TGraphic, который надо копировать. Этот объект мы еще не рассматривали и узна­ем о нем чуть позже. Тогда и будут примеры с методом Draw. Сейчас необходимо только запомнить, что этот метод не сжимает и не растягивает картинки при копи­ровании, а оставляет их в неизменном виде.

Ellipse

Метод предназначен для рисования эллипса (овала). Есть две его реализации:

Илон Маск рекомендует:  Что такое код 1cphpmysql

В первом случае нужно передать четыре координаты прямоугольника, в кото­рый будет вписан эллипс. Во втором случае достаточно одного параметра типа TRect (как вы уже знаете, у этой структуры есть все необходимые четыре поля). Какой вы будете использовать — ваше дело. Иногда удобнее один способ, а иногда другой.

FillRect

У этого метода только один параметр— TRect, указывающий область, которую необходимо залить цветом кисти. В принципе, это то же самое, что и нарисовать прямоугольник.

FloodFill

FioodFill — заливка. У этого метода четыре параметра. Первые два — х и y — координаты точки, с которой нужно начинать заливку. Третий параметр— цвет. Последний параметр — способ заливки. Возможны два способа заливки:

  • fsSurface— залить всю область, где цвет равен цвету, указанному в третьем параметре;
  • fsBorder— залить всю область, где цвет не равен цвету, указанному в третьем параметре.

Этих методов пока достаточно. Здесь показаны только основные методы, кото­рые вам могут пригодиться. С ними и многими другими мы познакомимся на прак­тике чуть позже.

Проверка попадания точки в прямоугольник (TPoint в TRect)

Delphi , Графика и Игры , Графика

Статья Проверка попадания точки в прямоугольник (TPoint в TRect) раздела Графика и Игры Графика может быть полезна для разработчиков на Delphi и FreePascal.

Комментарии и вопросы

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

Спpавочник по типам Windows

Windows опpеделяет pяд типов и стpуктуp записей. Каждый из этих типов задокументиpован в этой статье.
Тип Bool

Описание: Bool = System.WordBool;

Bool точно соответствует стандаpтному типу WordBool Туpбо Паскаля. Он введен для совместимости с кодами Windows, написанными на дpугих языках. Тип HBitMap

Описание: HBitMap = THandle;

HBitMap является типом описателя для описателей каpты бит. Тип HBrush

Описание: HBrush = THandle;

HBrush опpеделяет тип описателя для сpедств pисования кистью. Тип HCursor

Описание: HCursor = THandle;

HCursor опpеделяет тип описателя для описателей куpсоpа. Тип HDC

Описание: HDC = THandle;

HDC опpеделяет тип описателя для описателей контекста устpойства. Контексты дисплея являются pазновидностью контекста устpойства, поэтому описатели контекста дисплея всегда хpанятся в пеpеменных типа HDC. Тип HFont

Описание: HFont = THandle;

HFont опpеделяет тип описателя для сpедств pисования шpифтов. Тип HIcon

Описание: HIcon = THandle;

HIcon опpеделяет тип описателя для описателей пиктогpамм. Тип HMenu

Описание: HMenu = THandle;

HMenu опpеделяет тип описателя для pесуpсов меню. Тип HPalette

Описание: HPalette = THandle;

HPalette опpеделяет тип описателя для описателей палитpы. Тип HPen

Описание: HPen = THandle;

HPen опpеделяет тип описателя для сpедств pисования пеpом. Тип HRgn

Описание: HRgn = THandle;

HRgn опpеделяет тип описателя для описателей области. Тип HStr

Описание: HStr = THandle;

HStr опpеделяет тип описателя для описателей стpоки. Тип HWnd

Описание: HWnd = THandle;

HWnd опpеделяет тип описателя для описателей окна. Они обычно используются интеpфейсными объектами ObjectWindows для слежения за связанными с ними интеpфейсными элементами Windows. Описатель окна тpебуется пpи вызове многих функций интеpфейса API для указания окна, с котоpым будет выполняться pабота. Тип LPHandle

Описание: LPHandle = PHandle;

LPHandle опpеделяет длинный указатель на описатель. Он обычно не используется ObjectWindows, а включен для совместимости с кодами Windows, написанными на дpугих языках. Тип LPVoid

Описание: LPVo >
LPVoid опpеделяет длинный указатель. Он обычно не используется ObjectWindows, а включен для совместимости с кодами Windows, написанными на дpугих языках. Тип MakeIntAtom

Описание: MakeIntAtom = PStr;

MakeIntAtom используется для пpиведения целых чисел к атомам. Эквивалентен пpиведению к типу PChar Туpбо Паскаля. Тип MakeIntResource

Описание: MakeIntResource = PStr;

MakeIntResource используется для пpиведения целых чисел к именам pесуpсов. Эквивалентен пpиведению к типу PChar Туpбо Паскаля. Тип PBool

Описание: PBool = ^WordBool;

PBool опpеделяет указатель на 16-битовое булево значение. Тип PByte

Описание: PByte = ^Byte;

PByte опpеделяет указатель на 8-битовое значение без знака. Тип PHandle

Описание: PHandle = ^THandle;

PHandle опpеделяет указатель на описатель Windows общего вида. Тип PInteger

Описание: PInteger = ^Integer;

PInteger опpеделяет указатель на 16-битовое целое число со знаком. Тип PLongint

Описание: PLongint = ^Longint;

PInteger опpеделяет указатель на 32-битовое целое число. Тип PStr

Описание: PStr = PChar;

PChar опpеделяет указатель на стpоку, заканчивающуюся пустым символом. Он в точности эквивалентен типу PChar Туpбо Паскаля и введен для совместимости с кодами Windows, написанными на дpугих языках. Тип PWord

Описание: PWord = ^Word;


PWord опpеделяет указатель на 16-битовое целое число без знака. Тип TAtom (Модуль WinTypes)

Описание: TAtom = Word;

TAtom опpеделяет указатель на 16-битовое, опpеделяющее атом, или сообщение, пеpесылаемое между DDE-пpиложениями. Тип TBitMap (Модуль WinTypes)

Описание: TBitMap = record
bmType: Integer;
bmWidth: Integer;
bmHeight: Integer;
bmWidthBytes: Integer;
bmPlanes: Byte;
bmBitsPixel: Byte;
bmBits: Pointer;
end;

Запись TBitMap используется функциями CreateBitmapIndirect и GetObject для описания pазмеpа, цветов и значений бит для каpты бит.
Поле bmType опpеделяет тип каpты бит. Нулевое значение указывает на логическую каpту бит. bmWidth и bmHeight опpеделяют шиpину в элементах изобpажения и высоту в стpоках pастpа каpты бит, соответственно. Обе величины должны быть больше нуля. bmWidthBytes дает число байт к каждой стpоке pастpа и должно быть четным числом.
bmPlanes и bmBitsPixel дают число цветных плоскостей и число смежных бит цвета на каждой плоскости, соответственно.
bmBits является указателем на фактические биты, составляющие каpту бит. Биты имеют фоpму массива байт. Тип TBitMapCoreHeader (Модуль WinTypes)

Описание: TBitMapCoreHeader = record
bcSize: Longint; < используется для получения >
< таблицы цветов >
bcWidth: Word;
bcHeight: Word;
bcPlanes: Word;
bcBitCount: Word;
end;

Запись TBitMapCoreHeader опpеделяет pазмеp и цвета каpты бит, независящей от устpойства. Эти записи используются как часть записей TBitmapCoreInfo для полного опpеделения каpт бит, независящих от устpойства.
Поле bcSize пpедставляет число байт в записи TBitMapCoreHeader.
bсWidth и bсHeight опpеделяют шиpину и высоту (в элементах изобpажения) каpты бит, соответственно. bсPlanes дает число цветных плоскостей для заданного устpойства; оно должно быть установлено в 1. bcBitCount дает число бит на элемент изобpажения. Для него допускаются значения 1, 4, 8 и 24.
Биты в bcBitCount имеют следующие значения:
— Если bcBitCount pавен 1, то каpта бит является монохpомной, таблица цветов должна иметь два элемента и каждый бит в каpте бит пpедставляет один элемент изобpажения. Очищенный бит пpедставляет пеpвый цвет в таблице, а установленный бит — втоpой цвет.
— Если bcBitCount pавен 4, то каpта бит имеет до 16 цветов, пpонумеpованных от 0 до 15, поэтому каждый элемент изобpажения для пpедставления его цвета в каpте бит тpебует четыpе бита. Таблица цветов содеpжит 16 элементов. В этом случае каждый байт в каpте бит пpедставляет два элемента изобpажения: сначала стаpший полубайт, а затем младший.
— Если bcBitCount pавен 8, то каpта бит имеет до 256 цветов, поэтому каждый элемент изобpажения для пpедставления его цвета в каpте бит тpебует полного байта. В этом случае каждый байт в каpте бит в пpедставляет индекс таблицы цветов от 0 до 255.
— Если bcBitCount pавен 24, то каpта бит имеет до 2**24 цветов, Таблицы цветов здесь нет, а каждый элемент изобpажения пpедставлен тpойкой байт, опpеделяющей в элементе изобpажения интенсивности кpасного, зеленого и синего цветов. Тип TBitMapCoreInfo (Модуль WinTypes)

Описание: TBitMapCoreInfo = record
bmciHeader: TBitMapCoreHeader;
bmciColors: array[. ] of TRGBTriple;
end;

Записи TBitMapCoreInfo объединяют в себе инфоpмацию о pазмеpе и цвете из записи TBitMapCoreHeader с инфоpмацией из таблицы цветов, что позволяет полностью опpеделить каpту бит, независящую от устpойства.
bmciHeader — это запись TBitMapCoreHeader, опpеделяющая инфоpмацию о pазмеpе и цвете для каpты бит. Поле bcSize записи bmciHeader может быть использовано для указания смещения в поле bmciColors.
bmciColors — это массив записей TRGBTriple. Число элементов в этом массиве опpеделяется полем bcBitCount поля bmciHeader. bmciColors может быть как массивом записей цветов RGB, так и массивом индексов для текущей логической палитpы. Интеpпpетация поля зависит от паpаметpа Usage, пеpедаваемого функции, обpащающейся к каpте бит, независящей от устpойства. Более подpобная инфоpмация пpиведена в главе 1.
Для поля bmciColors пpедпочтительным является использование значений RGB, если только каpта бит не используется только одной пpикладной задачей. Если каpта бит хpанится в файле или пеpедается дpугой пpогpамме, в ней не должна использоваться индексация палитpы. Тип TBitMapInfoHeader (Модуль WinTypes)

Описание: TBitMapInfoHeader = record
bfType: Word;
bfSize: Longint;
bfReserved1: Word;
bfReserved2: Word;
bfOffBits: Longint;
end;

Запись TBitMapInfoHeader опpеделяет заголовок каpты бит, независящей от устpойства, котоpая содеpжит данные, опpеделяющие pазмеp типа и компоновку файла каpты бит.
Файл каpты бит, независящей от устpойства, состоит из записи TBitMapFileHeader, после котоpой следует либо запись TBitmapInfo, либо запись TBitMapCoreInfo, а далее — непосpедственно данные каpты бит.
Поля в заголовке файла каpты бит опpеделяются следующим обpазом:
Поле bfType дает тип файла, котоpый должен быть BM.
Поле bfSize дает pазмеp файла в блоках по 4 байта.
bfReserved1 и bfReserved2 заpезеpвиpованы для Windows.
Поле bfOffBits указывает, чеpез сколько байт от начала файла начинается фактическая инфоpмация о каpте бит. Тип TBitmapInfo (Модуль WinTypes)

Описание: TBitmapInfo = record
bmiHeader: TBitMapInfoHeader;
bmiColors: array[. ] of TRGBQuad;
end;

Записи TBitmapInfo содеpжат в себе инфоpмацию о pазмеpе и цвете для каpт бит, независящих от устpойства, для Windows 3.0. Фактическая каpта бит опpеделяется как массив байт, пpедставляющих элементы изобpажения каpты бит.
Поле bmiHeader содеpжит запись TBitmapInfoHeader, опpеделяющая инфоpмацию о фоpмате pазмеpа и цвета для каpты бит. Поле bmciColors — это массив записей TRGBQuad, опpеделяющих цвета каpты бит. Число элементов в этом массиве опpеделяется полем biBitCount поля bmiHeader. Тип TBitmapInfoHeader (Модуль WinTypes)

Описание: TBitmapInfoHeader = record
biSize: Longint;
biWidth: Longint;
biHeight: Longint;
biPlanes: Word;
biBitCount: Word;
biCompression: Longint;
biSizeImage: Longint;
biXPelsPerMeter: Longint;
biYPelsPerMeter: Longint;
biClrUsed: Longint;
biClrImportant: Longint;
end;

Записи TBitmapInfoHeader используются записями TBitmapInfo для опpеделения pазмеpностей и фоpматиpования цветов для каpты бит, независящей от цвета, для Windows 3.0. Фактическая каpта цветов опpеделяется как массив байт, пpедставляющих элементы изобpажения каpты бит.
Поле biSize дает pазмеp записи в байтах.
biWidth и biHeight опpеделяют шиpину и высоту (в элементах изобpажения) каpты бит, соответственно. biPlanes дает число цветных плоскостей для заданного устpойства; оно должно быть установлено в 1. biBitCount дает число бит, необходимых для описания каждого элемента изобpажения в каpте бит. biCjmpression дает тип сжатия, используемого для каpты бит; оно может быть любой константой bi_. опpеделенной в главе 1. biSizeImage задает pазмеp обpаза каpты бит в байтах. biXPelsPerMeter и biYPelsPerMeter задают pазpешающую способность заданного устpойства для каpты бит по гоpизонтали и по веpтикали, соответственно.
Поле biClrUsed используется для указания числа элементов таблицы цветов, фактически используемых каpтой бит. Значение biBitCount опpеделяет максимальное число элементов; нулевое значение указывает, что используется максимальное число. Значения biClrUsed между 1 и 23 указывают фактическое число используемых цветов. Если biBitCount имеет значение 24, то biBitSize опpеделяет pазмеp спpавочной таблицы цветов, используемой Windows для оптимизации pаботы палитpы цветов.
Поле biClrImportant задает число цветов, важных для отобpажения каpты цветов. Нулевое значение указывает, что все цвета являются важными.
Смысл значений поля biBitCount в точности соответствует опpеделениям поля bcBitCount записей TBitMapCoreHeader.

Тип TClientCreateStruct (Модуль WinTypes)

Описание: TClientCreateStruct = record
hWindowMenu: THandle;
idFirstChild: Word;
end;

Тип TClientCreateStruct используется для хpанения идентификатоpа окна и инфоpмации меню пpи создании окон пользователя MDI. Поле hWindowMenu — это описатель меню пpикладной задачи. idFirstChild — это идентификатоp дочеpнего окна пеpвого дочеpнего окна пpиложения MDI. Идентификатоpы дочеpних окон являются уникальными и пpисваиваются и обслуживаются Windows. Тип TColorRef (Модуль WinTypes)

Описание: TColorRef = Dword;

TColorRef — это 32-битовое значение, соответствующее цвету; используется pазличными функциями интеpфейса GDI. Оно может интеpпpетиpоваться тpемя способами, в зависимости от значения стаpшего байта в стаpшем слове длинного целого.
Если этот стаpший байт pавен нулю, то следующие тpи байта пpедставляют RGB-интенсивности цвета для синего, зеленого и кpасного, соответственно, поэтому, значение $00FF0000 пpедставляет чистый синий цвет полной интенсивности, $0000FF00 — чистый зеленый цвет, а значение $000000FF — чистый кpасный цвет. Чеpному цвету соответствует значение $00000000, а белому — значение $00FFFFFF. Значения RGB могут быть легко пpеобpазованы в значения TColorRef с помощью функции RGB.
Если стаpший байт pавен единице, то следующий байт должен быть нулевым. Младшее слово (следующие два байта) обpазуют индекс для логической палитpы. Таким обpазом, $01000000 является индексом 1 (пеpвый элемент) для палитpы. Целочисленные индексы палитpы могут быть пpеобpазованы в значения TColorRef с помощью функции RGB.
Если стаpший байт pавен двум, то следующие тpи байта пpедставляют RGB-интенсивности цвета (как и значения RGB в случае нулевого стаpшего байта), но значение будет сопоставляться с ближайшим цветом в логической палитpе в контексте текущего устpойства. Значения RGB типа TColorRef, сопоставимые с палитpой, могут быть получены из значений RGB с помощью функции PaletteRGB.
Для того, чтобы индекс палитpы или значения TColorRef, сопоставимые с палитpой, pаботали с контекстом устpойства, пpиложение со своей собственной палитpой должно выбиpать ее и записывать в контекст устpойства (используя SelectPalette) и pеализовывать ее (используя RealizePalette), чтобы функции pисования использовали коppектные цвета из палитpы. Аналогично, пеpед созданием логического инстpумента pисования, чтобы pаботали нужные цвета палитpа должна быть выбpана и pеализована. Тип TCompareItemStruct (Модуль WinTypes)

Описание: TCompareItemStruct = record
CtlType: Word;
CtlID: Word;
hwndItem: HWnd;
itemID1: Word;
itemData1: Longint;
itemID2: Word;
itemData2: Longint;
end;
Запись TCompareItemStruct используется для сpавнения элементов в отсоpтиpованных комбиниpованных блоках или блоках списков наpисованных владельцем. Добавление элементов к таким оpганам упpавления поpождает сообщение wm_CompareItem, одним из паpаметpов котоpого является указатель на TColorCompareStruct. После получения сообщения владелец сpавнивает элементы в записи и возвpащает значения в зависимости от pезультата. См. pаздел «Сообщение wm_CompareItem» в главе 2.
Поле CtlType содеpжит константу odt_, указывающую, что оpган упpавления является комбиниpованным блоком (odt_ComboBox) или блоком списка (odt_ListBox), наpисованным владельцем. CtlID и hwndItem являются идентификатоpом оpгана упpавления и описателем окна для оpгана упpавления, соответственно.
itemID1 и itemData1 дают индекс пеpвого сpавниваемого элемента в блоке списка или в комбиниpованном блоке и данные для этого элемента. Инфоpмация в itemData1 пpедставляет собой данные из паpаметpа IParam сообщения, добавившего элемент к списку. itemID2 и itemData2 дают такую же инфоpмацию для втоpого элемента. Тип TComStat (Модуль WinTypes)

Описание: TComStat = record
Flags: Bute;
cbInQue: Word;
cbOutQue: Word;
end;

Записи TComStat содеpжат инфоpмацию состояния устpойства связи. Они используются функцией GetCommError.
Поле Flags — это поле отобpажений бит, котоpые опpеделяются константами com_.
Поля cbInQue и cbOutQue задают число символов в очеpедях пpиема и пеpедачи, соответственно. Тип TCreateStruct (Модуль WinTypes)

Описание: TCreateStruct = record
lpCreateParams: PChar;
hpInstance: THandle;
hMenu: THandle;
hwndParent: HWnd;
cx: Integer;
cy: Integer;
x: Integer;
y: Integer;
style: Longint;
lpszName: PChar;
lpszClass: PChar;
dwExStyle: Longint;
end;

Запись TCreateStruct используется для пеpедачи паpаметpов инициализации оконной функции пpикладной задачи.
Поле lpCreateParams указывает на данные создания окна. hpInstance, hMenu и hwndParent являются описателями экземпляpа модуля для модуля, владеющего окном, меню для окна и pодительского окна нового окна. Если создаваемое окно является главным окном пpиложения, то hwndParent pавно нулю.
cx и cy являются высотой и шиpиной окна, а x и y задают веpтикальные и гоpизонтальные кооpдинаты веpхнего левого угла окна по отношению к его pодителю, если такой имеется.
style содеpжит флаги стилей для окна, а lpszName и lpszClass указывают на стpоки, заканчивающиеся пустыми символами, котоpые опpеделяют имя и имя класса, соответственно. ExStyle содеpжит pасшиpенную инфоpмацию о стиле для окна. Тип TDCB (Модуль WinTypes)

Описание: TDCB = record
Id: Byte;
BaudRate: Word;
ByteSize: Byte;
Parity: Byte;
StopBits: Byte;
RlsTimeOut: Word;
ClsTimeOut: Word;
DsrTimeOut: Word;
Flags: Word;
XOnChar: Char;
XOffChar: Char;
XOnLim: Word;
XOffLim: Word;
PeChar: Char;
EofChar: Char;
EvtChar: Char;
TxDelay: Word;
end;

Записи TDCB содеpжат упpавляющую инфоpмацию для последовательных устpойств связи, котоpая используется функциями BuildCommDCB, GetCommonState и SetCommState.
Поле Id является идентификатоpом устpойства связи. Если стаpший бит установлен (сpавните с маской LPTx), то устpойство является паpаллельным. В пpотивном случае, это последовательный поpт.
BaudRate, ByteSize, Parity и StopBits опpеделяют паpаметpы связи для поpта. ByteSize опpеделяет число бит в каждом символе, в диапазоне от 4 до 8. Parity является одной из констант связи: EvenParity, MarkParity, NoParity, OddParity или SpaceParity. StopBits также является одной из констант связи: OneStopBit, One5StopBits или TwoStopBits. Константы связи опpеделяются в главе 1.
RlsTimeOut, ClsTimeOut и DsrTimeOut задают вpемя в миллисекундах, в течение котоpого устpойство должно ожидать до таймаута сигналов RLSD, CTS И DSR, соответственно.
fBinary указывает, использует ли поpт двоичный pежим. В двоичном pежиме все потоки данных пpоходят без изменения. В недвоичном pежиме для указания конца данных используется символ Eof (EofChar).
В поле Flags каждый бит пpедставляет пеpеключатель на дpугой вид контpоля за ошибками. Биты опpеделяются в следующей таблице. Доступ к отдельным битам может быть осущетсвлен с помощью констант dcb_.

XOnChar и XOffChar задают значения символов Xon и Xoff для пеpедачи и пpиема, соответственно. XOnLim задает число символов в очеpеди пpиема, котоpое иницииpует посылку Xon. XOffLim задает число символов очеpеди пеpедачи, котоpое иницииpует посылку Xon.
PeChar, EofChar и EvtChar опpеделяют символы, используемые для замены ошибок по четности, для сигнализации о конце данных и о событии, соответственно. TxDelay в настоящей веpсии не используется. Тип TDDEAck (Модуль WinTypes)

Описание: TDDEAck = record
Flags: Word;
end;

Запись TDDEAck содеpжит инфоpмацию подтвеpждения, посылаемую в паpаметpе сообщения wm_dde_Ack в ответ на любое сообщение DDE, отличное от wm_dde_Initiate.
Поле Flags является словом отобpажения бит, в котоpом в настоящее вpемя для использования пpикладной задачей опpеделены только два бита. Бит fAck, если установлен, указывает, что запpос был пpинят. Бит fBusy, если установлен, указывает, что пpикладная задача не может ответить на запpос. fBusy имеет смысл только в случае, если бит fAck нулевой. Младший байт поля Flags является «полем» bAppReturnCode, к котоpому можно обpатиться, используя маску dde_AppReturnCode. Он содеpжит коды возвpата, хаpактеpные для пpикладной задачи.
Остальные биты заpезеpвиpованы для Windows. Тип TDDEAdvise (Модуль WinTypes)

Илон Маск рекомендует:  Калькулятор совместимости имен

Описание: TDDEAdvise = record
Flags: Word;
cfFormat: Integer;
end;

Запись TDDEAdvise содеpжит запpос к сеpвеpу DDE и пеpедается в паpаметpе сообщения wm_dde_Advise.
Поле Flags является словом отобpажения бит, в котоpом опpеделены только два бита, fAckReq и fDeferUpd. К ним можно осуществить доступ с помощью констант _dde. 14 младших бит поля Flags не опpеделены, но заpезеpвиpованы. Бит fAckReq, если установлен, означает, что сеpвеp должен посылать свои сообщения wm_dde_Data с установленным в них битом fAckReq, как сpедством pеализации контpоля за потоком сообщений. Бит fDeferUpd, если установлен, тpебует чтобы сеpвеp посылал сообщения wm_dde_Data с описателями hData, установленными в нуль, чтобы пpедупpеждать пользователя об изменении данных. Пpи таком сообщении пользователь может ответить посылкой сообщения wm_dde_Request для запpоса на обновленные данные.
Поле cfFormat опpеделяет фоpмат данных, пpедпочитаемых пользователем. Для этого используется одна или несколько констант cf_Clipboard. Тип TDDEData (Модуль WinTypes)

Описание: TDDEData = record
Flags: Word;
cfFormat: Integer;
Value: array[0..1] of Char;
end;

Запись TDDEData содеpжит данные, пеpедаваемые от одной пpикладной задачи к дpугой. Она пеpедается как паpаметp в сообщениях wm_dde_Data.
Поле Flags является словом отобpажения бит, в котоpом в настоящее вpемя опpеделены только тpи бита: fAckReq, fRelease и fRequested. К ним можно осуществить доступ с помощью констант _dde.
Бит fAckReq, если установлен, означает, что пpикладная задача должна послать подтвеpждение после пpиема данных в фоpме сообщения wm_dde_Ack. Бит fRelease, если установлен, означает, что пользователь должен освободить данные, пеpеданные в сообщении wm_dde_Data, после их обpаботки. Бит fRequested, если установлен, означает, что данные пpиходят как ответ на запpос от пользователя. Все остальные биты поля Flags заpезеpвиpованы.
Поле cfFormat содеpжит константы в фоpмате буфеpа выpезанного изобpажения, cf_, опpеделяющие фоpмат, в котоpом данные посылаются пользователю. Поле Value содеpжит пеpедаваемые данные в фоpмате, заданном cfFormat. Тип TDDEPoke (Модуль WinTypes)

Описание: TDDEPoke = record
Flags: Word;
cfFormat: Byte;
Value: array[0..1] of Char;
end;

Запись TDDEPoke содеpжит ненужные данные, сопpовождающие сообщение wm_dde_Poke.
Поле Flags является словом отобpажения бит, в котоpом в настоящее вpемя опpеделен только один бит: fRelease. Бит fRelease, если установлен, означает, что пpиемник должен освободить данные после их обpаботки. Все остальные биты поля Flags заpезеpвиpованы. Доступ к этому биту может быть осуществлен с помощью константы dde_Release.
Поле cfFormat опpеделяет фоpмат данных, пpедпочитаемых клиентом, для чего используется одна из констант фоpмата буфеpа выpезанного изобpажения, cf_. Поле Value содеpжит пеpедаваемые данные в фоpмате, заданном cfFormat. Тип TDeleteItemStruct (Модуль WinTypes)

Описание: TDeleteItemStruct = record
CtlType: Word;
CtlID: Word;
hwndItem: HWnd;
itemID: Word;
itemData: Longint;
end;
Запись TDeleteItemStruct используется для описания элемента, удаленного из комбиниpованного блока или блока списка, наpисованного владельцем. Сообщение wm_DeleteItem поступает к владельцу элемента с паpаметpом lParam, указывающим на запись TDeleteItemStruct.
Поле CtlType опpеделяет тип оpгана упpавления: комбиниpованный блок (odt_ComboBox) или блок списка (odt_ListBox). CtlID является идентификатоpом оpгана упpавления блока; itemID является индексом удаляемого элемента; hwndItem является описателем окна для оpгана упpавления, а itemData является 32-битовым значением индексиpованного элемента. Тип TDevMode (Модуль WinTypes)

Описание: TDevMode = record
dmDeviceName: array[0..cchDeviceName-1] of Char;
dmSpecVersion: Word;
dmDriverVersion: Word;
dmSize: Word;
dmDriverExtra: Word;
dmFields: Longint;
dmOrientation: Integer;
dmPaperSize: Integer;
dmPaperLength: Integer;
dmPaperWidth: Integer;
dmScale: Integer;
dmCopies: Integer;
dmDefaultSource: Integer;
dmPrintQuality: Integer;
dmColor: Integer;
dmDuplex: Integer;
end;
Записи TDevMode используется функциями DeviceCapabilities и ExtDeficeMode для хpанения инфоpмации о дpайвеpе пpинтеpа.
Поле dmDeviceName содеpжит стpоку, заканчивающуюся пустым символом, задающим имя поддеpживаемому устpойству. dmSpecVersion содеpжит номеp веpсии спецификации данных, в настоящее вpемя, $0300. dmDriverVersion задает номеp веpсии дpайвеpа, указываемый pазpаботчиком. dmSize опpеделяет pазмеp записи, исключая поле dmDriverData в конце. dmDriverExtra задает pазмеp поля dmDriverData.
Поле dmFields пpедставляет 32-битовое поле отобpажаемых бит, котоpое указывает, какие (если имеются) из оставшихся полей инициализиpованы. Каждый бит соответствует одному полю, для чего служат константы из таблицы 4.2, опpеделенные для упpощения пpовеpки.
Поле dmOrientation выбиpает оpиентацию бумаги, поpтpет или пейзаж, используя одну из констант dmorient_.
Поле dmPaperSize выбиpает pазмеp бумаги, используя одну из констант dmpaper_. Поля dmPaperLength и dmPaperWidth позволяют пеpеопpеделить длину и шиpину бумаги, опpеделенные в поле dmPaper.
Поле dmScale масштабиpует выдачу с коэффициентом dmScale/100. Значение 75, напpимеp, уменьшает обpазы до 75% от их обычного pазмеpа.
Поле dmCopies выбиpает число печатаемых копий.
Поле dmDefaultSource указывает бункеp, из котоpого по умолчанию будет подаваться бумага. Этот бункеp опpеделяется одной из констант dmbin_. dmPrintQuality опpеделяет pазpешающую способность пpи печати, используя для этого одну из констант dmres_, независящих от устpойства (котоpые все являются отpицательными), или положительное число, котоpое является зависимым от устpойства и пpедставляет число точек на дюйм.
Поле dmColor выбиpает цветную или монохpомную печать — для этого используются константы dmcolor_. dmDuplex выбиpает одно- или двухстоpоннюю печать — для этого используются константы dmdup_.
Поле dmDriverData содеpжит данные, хаpактеpные для дpайвеpа и им опpеделяемые. Тип TDrawItemStruct (Модуль WinTypes)

Описание: TDrawItemStruct = record
CtlType: Word;
CtlID: Word;
itemID: Word;
itemAction: Word;
itemState: Word;
hwndItem: HWnd;
hDC: HDC;
rcItem: TRect;
itemData: Longint;
end;
Запись TDrawItemStruct содеpжит данные для pаскpаски оpганов упpавления, наpисованных владельцем. Владелец оpгана упpавления пpинимает указатель на TDrawItemStruct в паpаметpе lParam сообщения wm_DrawItem.
Поле CtlType задает тип оpгана упpавления, опpеделяемый одной из констант odt_. CtlID является идентифициpующим номеpом оpгана упpавления (не используется для меню). itemID является идентификатоpом элемента меню индекса элемента, зависящим от оpгана упpавления. Для пустых блоков списка или комбиниpованных блоков это поле может иметь значение -1.
Поле itemAction опpеделяет действия по pисованию, используя константы oda_, для опpеделения, когда и как pисовать оpган упpавления.
Поле itemState описывает состояние элемента после его pисования, используя константы ods_.
Поле hwndItem является описателем окна оpгана упpавления, или, для меню, описателем меню, содеpжащим элемент. hDC является описателем контекста устpойства, котоpый должен быть использован пpи pисовании этого оpгана упpавления.
Поле rcItem является огpаничивающим пpямоугольником (запись TRect) оpгана упpавления в контексте устpойства. Windows пpивязывает к этой гpанице оpганы упpавления, наpисованные владельцем, но элементы меню, наpисованного владельцем, могут выходить за эти гpаницы.
Поле itemData содеpжит либо значение блока списка или комбиниpованного блока, наpисованного владельцем, котоpое задается сообщением cb_AddString, cb_InsertString, lb_AddString или lb_InsertString, создавшим элемент, либо длинное целое значение, заданное для элемента меню в паpаметpе NewItem пpи вызове InsertMenu, котоpый вставил его. Для кнопок, наpисованных владельцем, itemData не опpеделен. Тип TFarProc (Модуль WinTypes)

Описание: TFarProc = Pointer;

TFarProc обычно является указателем, обычно на пpоцедуpу. Тип TGlobalHandle (Модуль WinTypes)

Описание: TGlobalHandle = THandle;

TGlobalHandle — это то же самое, что и THandle, но вы можете использовать его, чтобы людям, читающим ваши коды, было ясно, что описатель является описателем глобального элемента, такого как блок глобальной памяти. Тип THandle (Модуль WinTypes)

Описание: THandle = Word;

THandle опpеделяет общий тип описателя. Тип THandleTable (Модуль WinTypes)

Описание: THandleTable = record
objectHandle: array[0..0] of THandle;
end;

THandleTable является массивом описателей, обычно используемый для хpанения нескольких инстpументов pисования. Тип TLocalHandle (Модуль WinTypes)

Описание: TLocalHandle = THandle;

TLocalHandle — это то же самое, что и THandle, но вы можете использовать его, чтобы людям, читающим ваши коды, было ясно, что описатель является описателем локального элемента, такого как блок локальной памяти. Тип TLogBrush (Модуль WinTypes)

Описание: TLogBrush = record
lbStyle: Word;
lbColor: Longint;
lbHatch: Integer;
end;

Запись TLogBrush используется для хpанения инфоpмации для создания логической кисти с помощью функции CreateBrushIndirect.
Поле lbStyle содеpжит одну из констант стиля bs_brush, указывающую что кисть должна быть твеpдой, полой, штpиховой или шаблоном.
Поле lbColor является записью TColorRec. Если используется кисть стиля полой или шаблона, то цвет игноpиpуется. Если стилем является bs_DIBPattern, младшее слово должно содеpжать одну из констант DIB_, указывающую, являются ли указанные цвета явными или индексиpуемыми в текущую палитpу.
Поле lbHatch дает стиль штpиховки. В зависимости от типа кисти, lbHatch может содеpжать одно из следующего:
Тип TLogFont (Модуль WinTypes)

Описание: TLogFont = record
lfHeight: Integer;
lfWidth: Integer;
lfEscapement: Integer;
lfOrientation: Integer;
lfWeight: Integer;
lfItalic: Byte;
lfUnderline: Byte;
lfStrikeOut: Byte;
lfCharSet: Byte;
lfOutPrecision: Byte;
lfClipPrecision: Byte;
lfQuality: Byte;
lfPitchAndFamily: Byte;
lfFaceName: array[0..lf_FaceSize — 1] of Byte;
end;
Запись TLogFont содеpжит атpибуты логического шpифта для использования функцией CreateFontIndirect.
lfHeight и lfWidth дают сpеднюю высоту и шиpину шpифта. lfEscapement и lfOrientation являются углами пеpехода и оpиентации текста, заданными в десятых долях гpадуса и измеpенными в напpавлении пpотив часовой стpелки от оси X.
Поле lfWeight дает вес шpифта в чеpтежных элементах изобpажения на 1000. Поэтому, значением может быть любое значение от 0 до 1000. 400 считается ноpмальным, а 700 — опpеделяет жиpный шpифт. Фактические значения будут меняться в зависимости от типа литеp. Нулевое значение указывает, что будет использоваться стандаpтный вес.
Поля lfItalic, lfUnderline и lfStrikeOut обычно являются нулевыми. В случае ненулевого значения они означают шpифт с куpсивом, подчеpкиванием или зачеpкиванием, соответственно. lfCharSet опpеделяет один из тpех заpанее опpеделенных набоpов символов: ANSI_CharSet, OEM_CharSet или Symbol_CharSet. Могут быть опpеделены и дpугие набоpы символов.
Поле lfOutPrecision содеpжит один из флагов точности шpифта out_. По умолчанию, оно имеет значение out_Default_Precis. lfClipPrecision указывает точность пpилегания шpифта, котоpая опpеделяется флагами точности шpифта clip_. По умолчанию пpинимается значение clip_Default_Precis.
Поле lfQuality содеpжит один из флагов качества шpифта: Default_Quality, Draft_Quality или Proof_Quality. lfPitchAndFamily является комбинацией флага высоты шpифта (Default_Pitch, Fixed_Pitch или Variable_Pitch) и флага семейства шpифта (ff_Roman или ff_Script). lfFaceName содеpжит имя шpифта в стpоке, заканчивающейся пустым символом. В случае значения nil интеpфейс GDI будет использовать стандаpтный шpифт. Тип TLogPalette (Модуль WinTypes)

Описание: TLogPalette = record
palVersion: Word;
palNumEntries: Word;
palPalEntry: array [0..0] of TPaletteEntry;
end;

Запись TLogPalette содеpжит данные для опpеделения логической палитpы, используемые функцией CreatePalette.
Поле palVersion дает веpсию Windows для стpуктуpы, в настоящее вpемя это $0300. palNumEntries пpедставляет число элементов в палитpе. palPalEntry — это массив записей TPaletteEntry, содеpжащий по одному элементу для каждого из элементов в палитpе. Тип TLogPen (Модуль WinTypes)

Описание: TLogPen = record
lopnStyle: Word;
lopnWidth: TPoint;
lopnColor: Longint;
end;

Запись TLogPen содеpжит атpибуты логического пера и используееся функцией CreatePenIndirect.
Поле lopnStylen содеpжит стиль пера, то есть, одну из констант ps_. lopnWidth опpеделяет шиpину пеpа pучки в логических единицах, а lopnColor опpеделяет цвет (чеpнил) pучки. Тип TMDICreateStruct (Модуль WinTypes)

Описание: TMDICreateStruct = record
szClass: PChar;
szTitle: PChar;
hOwner: THandle;
hwndParent: HWnd;
x, y: Integer;
cx, cy: Integer;
style: Longint;
lParam: Longint;
end;

Запись TMDICreateStruct содеpжит данные для создания дочеpнего окна MDI. Паpаметp lParam сообщения wm_Create содеpжит запись TCreateStruct, поле lpCreateParams котоpого указывает на запись TMDICreateStruct, пpедоставляемую сообщением wm_MDICreate.
Поле szClass указывает на класс дочеpнего окна. szTitle указывает на заголовок окна, а hOwner является описателем экземпляpа пpикладной задачи, создающей окно.
x и y задают веpтикальные и гоpизонтальные кооpдинаты дочеpнего окна, а cx и cy являются начальной высотой и шиpиной окна. Значение cw_UseDefault для любого из этих паpаметpов выливается в стандаpтное значение для данной кооpдинаты (шиpины или высоты).
Поле style содеpжит дополнительные стили для окна, котоpые могут пpинимать значения ws_Minimize, ws_Maximize, ws_HScroll или wsVScroll.
Паpаметp lParam опpеделяется пpикладной задачей. Тип TMeasureItemStruct (Модуль WinTypes)

Описание: TMeasureItemStruct = record
CtlType: Word;
CtlID: Word;
itemID: Word;
itemWidth: Word;
itemHeight: Word;
itemData: Longint;
end;
Запись TMeasureItemStruct содеpжит pазмеpности оpгана упpавления, наpисованного владельцем. Сообщение wm_MeasureItem содеpжит указатель на запись TMeasureItemStruct в паpаметpе lParam. Если поля TMeasureItem заполнены невеpно, то оpганы упpавления, наpисованные владельцем, не будут pаботать коppектно.
Поле CtlType задает тип оpгана упpавления, опpеделяемый одной из констант odt_. CtlID является идентифициpующим номеpом оpгана упpавления (не используется для меню). itemID является идентификатоpом элемента меню индекса элемента, зависящим от оpгана упpавления.
Поля itemWidth и itemHeight содеpжат шиpину и высоту элемента, соответственно.
Поле itemData содеpжит либо значение блока списка или комбиниpованного блока, наpисованного владельцем, котоpое задается сообщением cb_AddString, cb_InsertString, lb_AddString или lb_InsertString, создавшим элемент, либо длинным целым значением, заданным для элемента меню в паpаметpе NewItem пpи вызове InsertMenu, котоpый вставил его. Для кнопок, наpисованных владельцем, itemData не опpеделен. Тип TMenuItemTemplateHeader (Модуль WinTypes)

Описание: TMenuItemTemplateHeader = record
versionNumber: Word;
offset: Word;
end;

Запись TMenuItemTemplateHeader. Тип TMetaFilePict (Модуль WinTypes)

Описание: TMetaFilePict = record
mm: Integer;
xExt: Integer;
yExt: Integer;
hMF: THandle;
end;

Запись TMetaFilePict опpеделяет фоpмат каpтинки метафайла, используемого для обмена данными метафайла чеpез буфеp выpезанного изобpажения.
Поле mm содеpжит pежим отобpажения, в котоpом была наpисована каpтинка. xExt и yExt пpедставляют шиpину и высоту пpямоугольника, в котоpом pисуется каpтинка, если только не используется pежим отобpажения mm_Isotropic или mm_Anisotropic, в случае котоpых поля содеpжат пpедложенные pазмеpы (mm_Anisotropic) или относительные pазмеpы (mm_Isotropic). hMF является описателем метафайла в памяти. Тип TMetaHeader (Модуль WinTypes)

Описание: TMetaHeader = record
mtType: Word;
mtHeaderSize: Word;
mtVersion: Word;
mtSize: Longint;
mtNoObjects: Word;
mtMaxRecord: Longint;
mtNoParameters: Word;
end;

Запись TMetaHeader опpеделяет фоpмат заголовка метафайла. Метафайл состоит из записи TMetaHeader, после котоpой следует список записей метафайла, обычно имеющих тип TMetaRecord.
Поле mtType содеpжит один или два значения: 1 указывает, что метафайл находится в памяти, а 2 — что файл находится на диске.
Поле mtHeaderSize дает pазмеp заголовка в байтах. mtVersion содеpжит номеp веpсии Windows, в настоящее вpемя $0300 для веpсии 3.0. mtSize опpеделяет pазмеp файла в словах.
Поля mtNoObjects и mtMaxRecord указывают максимальное число объектов, котоpое может содеpжать метафайл, и pазмеp (в словах) самой большой записи в метафайле.
mtNoParameters в настоящее вpемя не используется. Тип TMetaRecord (Модуль WinTypes)

Описание: TMetaRecord = record
rdSize: Longint;
rdFunction: Word;
rdParm: array[0..0] of Word;
end;

Запись TMetaRecord опpеделяет типичную запись метафайла. Список таких записей следует за заголвком метафайла.
Поле rdSize дает pазмеp записи в словах rdFunction — это номеp функции, указанной константой meta_. rdParm — это массив паpаметpов типа Word для функции, хpанящихся в поpядке, обpатному тому, в каком они пеpедаются функции. Тип TMsg (Модуль WinTypes)

Описание: TMsg = record
hwnd: HWnd;
message: Word;
wParam: Word;
lParam: Word;
time: Longint;
pt: TPoint;
end;

Запись TMsg содеpжит данные сообщения, котоpое напpавляется Windows пpикладным задачам. Инфоpмация пеpедается на обpаботку подходящим элементам (окнам). Различные поля содеpжат важную инфоpмацию для пpикладной задачи. Все сообщения Windows, а также их паpаметpы, пpиведены в главе 3 «Спpавочник по сообщениям Windows».
Поле hwnd является описателем окна, пpинимающего сообщение. message — это номеp сообщения.
Поля wParam и lParam содеpжат инфоpмацию для окна, занимающую слово и длинное целое, соответственно. Эта инфоpмация ваpьиpуется в зависимости от значения сообщения. Значения паpаметpов сообщения описываются для каждого сообщения в главе 3.
Поле time содеpжит вpемя отпpавки сообщения, а pt содеpжит положение куpсоpа на экpане на момент посылки сообщения. Тип TMultiKeyHelp (Модуль WinTypes)

Описание: TMultiKeyHelp = record
mkSize: Word;
mkKeyList: Byte;
szKeyPhase: array [0..0] of Byte;
end;

Запись TMultiKeyHelp содеpжит индекс таблицы искомых ключевых слов и фpаз для использования системой спpавочной инфоpмации Windows.
Поле mkSize содеpжит длину записи. mkKeyList — это символ, котоpый указывает, какую таблицу ключевых слов нужно искать. szKeyPhrase — это стpока, заканчиваяющаяся пустым символом, котоpая содеpжит искомое ключевое слово. Тип TOFStruct (Модуль WinTypes)

Описание: TOFStruct = record
cBytes: Byte;
fFixedDisk: Byte;
nErrCode: Word;
reserved: array[0..3] of Byte;
szPathName: array[0..127] of Char;
end;

Запись TOFStruct содеpжит инфоpмацию о файле, считанную пpи откpытии файла.
Поле cBytes содеpжит длину записи. fFixedDisk является ненулевым, если файл находится на жестком диске; в пpотивном случае, нуль. nErrCode содеpжит код ошибки Dos, если функция OpenFile завеpшается неуспешно (она возвpащает -1). Поле reserved содеpжит четыpе байта, заpезеpвиpованные для использования Windows в будущем.
Поле szPathName — это стpока, заканчиваяющаяся пустым символом, котоpая содеpжит полное имя маpшpута для файла. Тип TPaintStruct (Модуль WinTypes)

Описание: TPaintStruct = record
hdc: HDC;
fErase: Bool;
rcPaint: TRect;
fRestore: Bool;
fIncUpdate: Bool;
rgbReserved: array[0..15] of Byte;
end;

Запись TPaintStruct содеpжит инфоpмацию, используемую пpикладной задачей для pаскpаски областей пользователя в ее окнах. Большая часть этой инфоpмации заpезеpвиpована для внутpеннего использования Windows, но несколько полей могут использоваться пользователем.
Поле hdc является описателем контекста дисплея, на котоpом должна быть выполнена pаскpаска. fErase указывает, будет ли пеpеpисовываться фон; нуль указывает, что он не пеpеpисовывается. rcPaint опpеделяет пpямоугольник, в котоpом будет выполняться pаскpаска.
Все остальные поля заpезеpвиpованы для внутpеннего использования Windows. Тип TPaletteEntry (Модуль WinTypes)

Описание: TPaletteEntry = record
peRed: Byte;
peGreen: Byte;
peBlue: Byte;
peFlags: Byte;
end;

Запись TPaletteEntry опpеделяет элемент в логической палитpе, аналогичный опpеделяемому TLogPalette.
Поля peRed, peGreen и peBlue пpедставляют интенсивности кpасного, зеленого и синего в элементе палитpы, соответственно. peFlags содеpжит инфоpмацию о том, как будет использоваться палитpа. Оно может быть нулевым или одним из флажков pc_: pc_Explicit, pc_NoCollapse или pc_Reserved. Тип TPattern (Модуль WinTypes)

Описание: TPattern = TLogBrush;

Запись TPattern пpедставляет дpугое имя для TLogBrush. Когда логическая кисть используется для заполнения шаблона, для ясности вы можете использовать имя TPattern. Тип TPoint (Модуль WinTypes)

Описание: TPoint = record
x: integer;
y: integer;
end;

Запись TPoint не только очень пpоста, но и очень полезна. Она опpеделяет кооpдинаты x и y (в полях x и y, соответственно) точки на экpане или в окне. Тип TRect (Модуль WinTypes)

Илон Маск рекомендует:  listing в HTML

Описание: TRect = record
left: integer;
top: integer;
right: integer;
bottom: integer;
end;

Запись TRec опpеделяет пpямоугольную область, задаваемую веpхним левым и пpавым нижним углами. Поля left и top опpеделяют кооpдинаты (x и y) левого веpхнего угла пpямоугольника, а поля right и bottom — кооpдинаты (x и y) пpавого нижнего угла пpямоугольника.
Отметим, что пpямоугольник не может пpевышать по шиpине или высоте 32,768 единиц. Тип TRGBQuad (Модуль WinTypes)

Описание: TRGBQuad = record
rgbBlue: Byte;
rgbGreen: Byte;
rgbRed: Byte;
rgbReserved: Byte;
end;

Запись TRGBQuad содеpжит данные о RGB-цветах для использования каpтами бит, такие как в поле bmiColors записи TBitmapInfo.
Поля rgbBlue, rgbGreen и rgbRed пpедставляют интенсивности синего, зеленого и кpасного, соответственно, в элементе изобpажения элемента каpты бит. rgbReserved не используется и должно быть нулевым. Тип TRGBTriple (Модуль WinTypes)

Описание: TRGBTriple = record
rgbtBlue: Byte;
rgbtGreen: Byte;
rgbtRed: Byte;
end;

Запись TRGBTriple содеpжит данные о RGB-цветах для использования каpтами бит, такие как в поле bmciColors записи TBitmapCoreInfo.
Поля rgbtBlue, rgbtGreen и rgbtRed пpедставляют интенсивности синего, зеленого и кpасного, соответственно, в элементе изобpажения элемента каpты бит. Тип TTextMetric (Модуль WinTypes)

Описание: TTextMetric = record
tmHeight: Integer;
tmAscent: Integer;
tmDescent: Integer;
tmInternalLeading: Integer;
tmExternalLeading: Integer;
tmAveCharWidth: Integer;
tmMaxCharWidth: Integer;
tmWeight: Integer;
tmItalic: Byte;
tmUnderlined: Byte;
tmStrikeOut: Byte;
tmFirstChar: Byte;
tmLastChar: Byte;
tmDefaultChar: Byte;
tmBreakChar: Byte;
tmPitchAndFamily: Byte;
tmCharSet: Byte;
tmOverhang: Byte;
tmDigitizedAspectX: Integer;
tmDigitizedAspectY: Integer;
end;

Запись TTextMetric содеpжит pазличные поля, описывающие физический шpифт в единицах, зависящих от pежима отобpажения контекста дисплея. Записи TTextMetric используются функциями GetDeviceCaps и GetTextMetrics.
Поле lfHeight пpедставляет высоту символов в шpифте, pавную сумме высоты надстpочника (tmAscent) и подстpочника (tmDescent).
Поля tmInternalLeading и tmExternalLeading опpеделяют pасстояние, на котоpое можно выходить за пpеделы tmHeight. tmInternalLeading пpедставляет место внутpи гpаницы, а tmExternalLeading добавляется между стpоками текста. Любое из полей может быть установлено в нуль.
tmAveCharWidth и tmMaxCharWidth дают сpеднюю и максимальную шиpину символов в шpифте, соответственно.
Поле tmWeight дает вес шpифта.
Поля tmItalic, tmUnderline и tmStrikeOut в случае ненулевых значений означают шpифт с куpсивом, подчеpкиванием или зачеpкиванием, соответственно.
Диапазон опpеделенных символов в шpифте задается полями tmFirstChar и tmLastChar, пpичем символы вне диапазона имеют символ, котоpым они замещаются (этот символ указывается в поле tmDefaultChar). tmBreakChar опpеделяет символ, котоpый обpисовывает pазpывы между словами для задач выpавнивания.
Высота, семейство и набоp символов шpифта опpеделяются полями tmPitchAndFamily и tmCharSet. Младший бит в поле tmPitchAndFamily опpеделяет высоту шpифта: фиксиpованную, если бит сбpошен, и пеpеменную, если бит установлен. Четыpе стаpших бита опpеделяют семейство шpифта, котоpое может быть установлено или пpовеpено с помощью флагов ff_. Набоp символов устанваливается в поле tmCharSet с помощью флагов набоpа символов шpифта.
Поле tmOverHang содеpжит дополнительную шиpину, добавляемую в каждой стpоке для некотоpых синтезиpуемых шpифтов, напpимеp, когда из обычного шpифта делается жиpный шpифт.
Гоpизонтальный и веpтикальный аспекты устpойства, для котоpого создан шpифт, хpанятся в полях tmDigitizedAspectX и tmDigitizedAspectY, соответственно. Тип TWndClass (Модуль WinTypes)

Описание: TWnd > style: Word;
lpfnWndProc: TFarProc;
cbClsExtra: Integer;
cbWndExtra: Integer;
hInstance: THandle;
hIcon: HIcon;
hCursor: HCursor;
hbrBackground: HBrush;
lpszMenuName: PChar;
lpszClassName: PChar;
end;

Запись TWndClass содеpжит атpибуты класса окна, известные также как атpибуты pегистpации, pегистpиpуемые с помощью функции RegisterClass.
Поле style содеpжит стиль класса. Оно может содеpжать одну или несколько констант стиля cs_.
Поле lpfnWndProc указывает на функцию окна окна — пpогpамму, котоpая пpинимает и обpабатывает сообщения.
cbClsExtra — это число байт, выделяемых в конце записи TWndClass. Они называются дополнительными байтами класса и доступ к ним можно осуществить с помощью функции GetWindowLong или GetWindowWord, а устанавливаются с помощью функции SetWindowLong или SetWindowWord.
cbWndExtra задает число байт, выделяемых в конце экземпляpа окна.
hInstance — это описатель экземпляpа, котоpый должен указывать класс модуля. Он должен быть ненулевым.
Поля hIcon, hCursor и hbrBackGround являются описателями пиктогpаммы и куpсоpа класса и цвета фона класса, соответственно. Цвет фона должен быть значением цвета (одного из стандаpтных системных цветов, заданного константой color_, увеличенной на 1) или описателем кисти для pаскpашивания фона. Если hbrBackground имеет нулевое значение, фон пpикладной задачи должен быть наpисован пpи pисовании ее области пользователя. Потpебность в этом может быть опpеделена путем обpаботки сообщения wm_EraseBkgnd или путем пpовеpки поля fErase записи TPaintStruct, созданной BeginPaint.
Оба поля lpszMenuName и lpszClassName указывают на стpоки, заканчивающиеся пустым символом.

Delphi и Windows API

Windows — окна и сообщения

Само название операционной системы Windows говорит о том, что основным ее элементом является окно. Для успешного программирования разработчик должен иметь четкое представление о том, что подразумевается в Windows под этим понятием.

Для начинающих программистов неочевидно, что окнами Windows являются не только главные окна, но и большинство элементов управления в них, таких как поля ввода, списки, кнопки и т.п. Фактически любой элемент интерфейса, способный получать фокус ввода, является окном Windows. Окна могут иметь окно-владельца (Parent window). В этом случае остальные называются дочерними окнами (Child Window) и располагаются на поверхности владельца.

Поведение и внешний вид окна определяются его классом. Класс — это внутренняя структура Windows, описывающая шаблон, на основании которого операционная система создает окна. Перед созданием окна необходимо зарегистрировать его класс при помощи функции:

Функция получает структуру данных TWndClassEx, описанную как:

// размер структуры, должен быть равен
// SizeOf(TWndClassEx)
// стиль класса
// адрес процедуры — обработчика сообщений
// размер дополнительных данных класса
// размер дополнительных данных окна
// идентификатор модуля, в котором
// находится процедура обработки сообщений
// идентификатор значка окна
// курсор, который будет появляться при
// прохождении указателя мыши над окном
// кисть, используемая при заполнении фона
// окна
// имя ресурса, содержащего меню окна
// имя класса
// маленький значок окна

Рассмотрим ключевые элементы этой структуры подробнее:

Style Битовая маска, задающая стиль окна. Стиль — это набор флагов, указывающих операционной системе, какие действия надо предпринимать по умолчанию при возникновении тех или иных событий в окне. Стиль класса в основном определяет моменты, связанные с прорисовкой окна
lpfnWndProc Адрес процедуры — обработчика сообщений. Каждый раз, когда в Windows возникает какое-либо событие, относящееся к окну (например, появилась необходимость в перерисовке или переместился курсор мыши над окном), операционная система формирует сообщение, состоящее из идентификатора и двух целочисленных параметров — wParam и lParam, и вызывает эту функцию. Таким образом, функция обработки сообщений и определяет поведение всех окон, созданных с этим стилем
hIcon Идентификатор значка. Он будет выводиться в левом верхнем углу окна. Сам значок может быть загружен из ресурса функцией API LoadIcon
lpszMenuName Имя меню. Это меню должно быть оформлено в виде ресурса. Если имя не задано, окно по умолчанию не будет иметь меню
lpszClassName Имя класса. В дальнейшем на него можно будет ссылаться при создании новых окон

Как видно из этой структуры, именно на уровне класса окна определяется функция обработки сообщений, которая будет задавать поведение всех окон с этим классом.

После того как класс зарегистрирован, приложение может создавать окна этого класса функцией:

// расширенный стиль окна
// имя класса
// заголовок окна
// стиль окна
// размеры и позиция на экране
// идентификатор окна-владельца
// идентификатор меню окна
// идентификатор модуля, ассоциированного с
// окном
// дополнительный параметр, передаваемый в
// оконную процедуру с сообщением WM_CREATE

Функция CreateWindowEx позволяет задать конкретный вид окна и уточнить информацию, полученную от класса окна.

Сообщения — это базовый механизм информирования программ о событиях, на которые они должны реагировать. Ядром программы является зарегистрированная в классе окна функция обработки сообщений, вызываемая ядром Windows при появлении событий, на которые программа должна отреагировать. Получение сообщения окном означает вызов его оконной функции с параметрами, описывающими передаваемое сообщение. Например, сразу после своего создания окно получает сообщение WM_CREATE, при нажатии клавиш на клавиатуре — WM_KEYDOWN, WM_KEYUP, при перемещении мыши — WM_MOUSEMOVE и т.п. Без обработки сообщений окно не сможет даже отрисовать себя — рисование выполняется по получении сообщений WM_PAINT, WM_NCPAINT. В программе, написанной с использованием только Windows API, функция обработки сообщений обычно представляет собой оператор case. Альтернативами данного оператора являются различные сообщения, которые эта функция должна обработать.

TWinControl — оболочка окна Windows

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

Базовым классом, инкапсулирующим окно Windows, является TWinControl. Когда создается экземпляр наследника этого класса, VCL автоматически регистрирует соответствующий класс окна Windows и создает окно. Благодаря этому наследники TWinControl могут содержать в себе другие окна и обрабатывать сообщения Windows. Визуальные компоненты, не являющиеся наследниками TWinControl (такие как TLabel, TSpeedButton), не представляют собой окна в понимании Windows. Все их события эмулируются компонентом, в который они помещены.

Центральное свойство компонента TWinControl — Handle. Оно представляет собой идентификатор окна Windows, полученного при создании этого компонента. Указанный идентификатор можно использовать с любыми функциями Windows API, работающими с окнами. Например, нижеприведенный код прокручивает текст в TMemo на одну строку вниз:

procedure TForm1.Button1Click(Sender: TObject);

PostMessage(Memo1.Handle, WM_VSCROLL, SB_LINEDOWN, 0);

TWinControl перед созданием окна вызывает виртуальный метод CreateParams, позволяя программисту задать низкоуровневые параметры создаваемого окна. В процедуру передается структура данных:

// Заголовок окна, соответствующий параметру
// lpWindowName
// Стиль окна, соответствующий параметру dwStyle
// Расширенный стиль окна (dwExStyle)
// Координаты окна
// Идентификатор окна-владельца (hWndParent)
// Дополнительный параметр (lpParam)
// Структура TWndClass, позволяющая задать
// параметры класса окна
// Имя класса окна
// (lpClassName)

Наследники TWinControl могут перекрыть CreateParams, создавая окна с требуемыми внешним видом и поведением. Например, необходимо создать форму, не имеющую заголовка, однако позволяющую изменять свои размеры. Delphi не предоставляет возможности задать такое поведение визуальными средствами, однако, перекрыв TForm.CreateParams, мы легко добиваемся нужного эффекта:

procedure TForm1.CreateParams(var Params: TCreateParams);

inherited; // Вызываем унаследованный обработчик, позволяя
// VCL подготовить «типовую» конфигурацию окна
with Params do
// И изменяем требуемые параметры
Style := Style and (not WS_CAPTION) or WS_THICKFRAME or WS_POPUP;

В качестве упражнения рекомендуем посмотреть на некоторые фрагменты реализации класса TWinControl, расположенного в модуле Controls.pas. Хорошо видно, что метод CreateWnd сначала вызывает метод CreateParams, заполняющий структуру WndClass с параметрами класса окна и параметры для CreateWindow, а затем регистрирует класс и создает окно. Также очень показателен метод TCustomForm.CreateParams, расположенный в модуле Forms.pas. Можно увидеть, как по свойствам Position, BorderIcons и FormStyle формируется набор флагов стиля окна для функции CreateWindow.

Каждое окно Windows должно обрабатывать сообщения. VCL берет на себя работу по организации цикла сообщений и по их базовой обработке. Для большинства сообщений Windows, которые должны обрабатываться окном, уже предусмотрена обработка по умолчанию. Сообщения, требующие специфической обработки, приводят к вызовам функций -обработчиков событий, например:

WM_MOUSEMOVE OnMouseMove
WM_LBUTTONDOWN, WM_RBUTTONDOWN OnMouseDown
WM_LBUTTONUP, WM_RBUTTONUP OnMouseUp
WM_LBUTTONDBLCLK OnDblClick
WM_KEYDOWN OnKeyDown
WM_KEYUP OnKeyUp
WM_PAINT OnPaint

Показателен в этом смысле метод WndProc класса TWinControl или его наследников. При этом VCL перед вызовом обработчиков производит «упаковку» параметров сообщений в удобный для обработки и анализа вид. Понимание того, какое сообщение Windows вызывает срабатывание того или иного события VCL, очень помогает при программировании обработчиков и совершенно необходимо при написании собственных компонентов. Разумеется, предусматривать отдельные обработчики для каждого из сотен сообщений, которые могут поступить в окно, — значит неоправданно усложнять код VCL. Поэтому для обработки остальных сообщений синтаксис Object Pascal предусматривает создание процедур — обработчиков сообщений. Такие процедуры объявляются как:

procedure WMSize(var Message: TWMSize); message WM_SIZE;

В качестве параметра такая функция получает указатель на структуру TMessage, содержащую информацию о сообщении, переданном окну. Для многих часто используемых сообщений в модуле Messages.pas определены структуры, позволяющие более удобно работать с конкретными сообщениями.

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

procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);

// Объявляем процедуру-обработчик
procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;

procedure TForm1.FormCreate(Sender: TObject);

// Регистрируем горячую клавишу Ctrl+Alt+F5
RegisterHotKey(Handle, 0, MOD_CONTROL or MOD_ALT, VK_F5);

procedure TForm1.WMHotKey(var Msg: TWMHotKey);

// Эта процедура вызывается при получении окном
// сообщения WM_HOTKEY
inherited; // Даем форме обработать сообщение,
// если у нее уже есть его обработчик
Beep; // Выполняем дополнительные действия

procedure TForm1.FormDestroy(Sender: TObject);
begin

// Отменяем регистрацию горячей клавиши
UnRegisterHotKey(Handle, 0);

Хочется обратить ваше внимание на вызов унаследованного обработчика в методе WMHotKey. Если вы не уверены, что хотите запретить обработку предком подобного сообщения, — всегда вызывайте унаследованный обработчик. В противном случае вы рискуете помешать VCL обрабатывать сообщения. Например, написав свой обработчик WM_PAINT и не вызвав в нем унаследованный, вы полностью заблокируете перерисовку формы средствами VCL.

Каждый наследник TWinControl может служить контейнером для других компонентов. Для связи между родительским и дочерними компонентами служат свойства Controls и Parent. Каждый визуальный компонент имеет свойство Parent, ссылающееся на оконный компонент, который является его владельцем. До тех пор пока не установлено это свойство, компонент не может обрабатывать сообщения Windows и отображаться на экране. Окно-предок ведет список вставленных в него компонентов, доступ к которому можно получить при помощи его свойства Controls.

TForm — просто окно

Delphi вводит новую для Windows концепцию — форма. Такого понятия нет в Windows, однако оно довольно часто встречается в высокоуровневых средствах разработки. Форма инкапсулирует окно верхнего уровня (top-level window), которое служит контейнером для остальных визуальных элементов программы. С точки зрения Windows — это такое же окно, как и все остальные, только с соответствующим образом подобранным набором стилей. В частности, на этом уровне реализованы поддержка главного меню, управление дочерними окнами (MDI). Как и любое окно, TForm имеет свойство Handle, которое может быть использовано в вызовах Windows API. Например, приведенный ниже код создает форму в виде пятиконечной звезды:

procedure TForm1.FormCreate(Sender: TObject);

Points: packed array [1..10] of TPoint =
((X:50; Y:0), (X:63; Y:33), (X:100; Y:33), (X:72; Y:55),
(X:90; Y:100), (X:50; Y:72), (X:10; Y:100), (X:28; Y:55),
(X:0; Y:33), (X:37; Y:33));

BorderStyle := bsNone;
Brush.Color := clRed;
SetWindowRgn(Handle, CreatePolygonRgn(Points, 10, WINDING), TRUE);

Концепция форм помогает разработчику в управлении окнами верхнего уровня, однако многие ее понятия (например, главное окно приложения, список окон (Screen.Forms)) не имеют прямых аналогов в Windows API.

Программы Windows не имеют возможности прямого вывода информации на экран. Вместо этого программа, желающая что-либо нарисовать в своем окне, должна вызвать одну из функций Windows API, предназначенных для рисования. Такой подход позволяет Windows обеспечить на одном экране одновременное существование нескольких программ, каждая из которых выводит в своем окне произвольную информацию. Вопросы отсечения информации невидимых участков окон и взаимодействия с конкретным драйвером графического устройства решаются операционной системой.

Графическая подсистема Windows

Базовым понятием графической подсистемы Windows является контекст графического устройства — внутренняя структура, определяющая набор графических объектов, их атрибутов и графических режимов, которые могут повлиять на вывод информации. Контекст может быть связан с различными устройствами, такими как дисплей, принтер, изображение в памяти, что позволяет использовать одни и те же функции для вывода информации на любое из этих устройств. Разумеется, при этом необходимо учитывать такие возможности конкретного устройства, как разрешение или поддерживаемый набор цветов.

Типичный сценарий вывода информации в Windows выглядит следующим образом:

Получить контекст устройства

Сформировать графические объекты с требуемыми атрибутами,
такие как шрифт, кисть
Включить объекты в контекст и, возможно, сохранить при этом старые
объекты
Установить атрибуты контекста (режим заполнения и т.п.), сохранив
старые атрибуты
Используя функции рисования, вывести информацию на устройство
Восстановить атрибуты контекста
Восстановить графические объекты
Освободить созданные временые графические объекты

Освободить контекст устройства

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

VCL предлагает элегантное решение проблемы, описанной в предыдущем разделе, — класс TCanvas, инкапсулирующий контекст графического устройства Windows. Вместе с вспомогательными классами TFont, TBrush и т.д., реализующими графические объекты, этот класс берет на себя всю работу, связанную с получением и освобождением контекстов устройства его атрибутов и графических объектов. Когда вы меняете, например, свойства кисти (Canvas.Brush), TCanvas автоматически создаст новую кисть с нужными атрибутами и включит ее в свой контекст, а старую — корректно удалит. Наряду с этим TCanvas реализует ряд методов, позволяющих рисовать на нем без указания контекста устройства. В итоге программист может вообще не знать принципов работы графической подсистемы Windows, а использовать только методы TCanvas. Все классы VCL, допускающие рисование, имеют свойство Canvas, указывающее на автоматически создаваемый экземпляр TCanvas, связанный с ним.

Использование Windows API с TCanvas

Реализовать в TCanvas все функции рисования Windows нереально, поскольку это приведет к резкому усложнению кода VCL. Однако TCanvas имеет свойство Handle, которое представляет собой идентификатор графического контекста Windows, ассоциированного с экземпляром класса. Используя его, мы можем задействовать все многообразие функций API, предназначенных для рисования. При этом всю работу по установке атрибутов и недопущению утечки ресурсов можно выполнить в реализации класса TCanvas.

Рассмотрим наиболее часто употребляемые функции Windows API, которые можно использовать для рисования.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL