Чтение онлайн

на главную

Жанры

Шрифт:

• масштабирования – определяет преобразование логических координат при графическом выводе в окна, на экран или принтер;

• заполнение контуров – определяет, каким образом будут применяться шаблоны кисти при заполнении контуров;

• сжатия – определяет, каким образом происходит преобразование цветов растровых изображений при их увеличении (уменьшении).

6.5. Работа со шрифтами

Приложение может использовать четыре различных вида технологий шрифта для отображения и печати текста:

• растровые;

• векторные;

• TrueType;

• ОрепТуре.

Отличие между данными видами шрифтов заключается в способе хранения параметров

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

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

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

6.6. Рисование примитивов

Теперь вы знаете хотя бы минимум теории, поэтому пора начинать практиковаться. Создадим простое приложение, которое будет рисовать на форме ряд примитивов. Для этого в новом приложении для формы сделаем обработку события OnPaint (листинг 6.1).

...

Листинг 6.1.

Обработчик события формы OnPaint

procedure TfmShapes.FormPaint(Sender: TObject);

var

hCurDC: HDC;

hCurPen, hOldPen: HPEN;

hCurBrush, hOldBrush: HBRUSH;

begin

//получаем общий контекст устройства

hCurDC := GetDC(Handle);

//создаем графический объект Карандаш

hCurPen := CreatePen(PS_SOLID, 2, RGB(255, 64, 0));

//выбираем его для общего контекста устройства экрана

//и запоминаем ранее выбранный

hOldPen := SelectObject(hCurDC, hCurPen);

//создаем графический объект Кисть

hCurBrush := CreateSolidBrush(RGB(0, 128, 255));

//выбираем ее для общего контекста устройства экрана

//и запоминаем ранее выбранную

hOldBrush := SelectObject(hCurDC, hCurBrush);

//рисуем эллипс

Ellipse(hCurDC, 10, 10, 100, 70);

//рисуем прямоугольник

Rectangle(hCurDC, 110, 10, 210, 70);

//прямоугольник с округленными углами

RoundRect(hCurDC, 10, 80, 100, 140, 10, 10);

//прямоугольник в виде «бочки»

RoundRect(hCurDC, 110, 80, 210, 140, 10, 100);

//рисуем прямую

MoveToEx(hCurDC, 10, 150, nil);

LineTo(hCurDC, 100, 220);

//рисуем дугу

Arc(hCurDC, 110, 150, 210, 220, 110, 150, 210, 220);

//восстанавливаем ранее выбранную кисть

SelectObject(hCurDC, hOldBrush);

//удаляем созданную кисть

DeleteObject(hCurBrush);

//восстанавливаем ранее выбранный карандаш

SelectObject(hCurDC, hOldPen);

//удаляем созданный карандаш

DeleteObject(hCurPen);

//освобождаем

общий контекст устройства

ReleaseDC(Handle, hCurDC);

end;

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

...

hCurDC := GetDC(Handle);

Она получает описатель контекста устройства экрана для клиентской области указанного окна или всего экрана. Функция имеет следующий формат заголовка:

...

Function GetDC(hWnd: HWND): HDC;

Здесь hWnd – дескриптор окна, для которого получается контекст устройства. Если это значение равно nil, то GetDC возвращает контекст устройства для всего экрана. В случае успешного выполнения функция возвращает контекст устройства. В противном случае ее результат равен nil.

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

...

hCurPen := CreatePen(PS_SOLID, 2, RGB(255, 64, 0));

Формат данной функции следующий:

...

Function CreatePen(fnPenStyle: Integer; nWidth: Integer; crColor: COLORREF): HPEN;

Параметр f nPenStyle задает стиль карандаша. Возможные значения этого параметра приведены в табл. 6.1.

Таблица 6.1

. Стили карандаша

Параметр nWidth задает ширину карандаша в логических единицах. EonnnWidth равен 0, то карандаш будет шириной в один пиксел независимо от текущей трансформации.

CreatePen возвращает карандаш с заданной шириной со стилем PSSOLID, если вы указали ширину больше, чем 1, для одного из стилей: PS_DASH, PS_DOT, PSJDASHDOT, PS_DASHDOTDOT.

Параметр crColor задает цвет карандаша.

Если функция завершилась удачно, то она возвращает дескриптор логического карандаша. В противном случае она возвращает nil.

После того как карандаш создан, следует его выбрать для полученного контекста при помощи функции SelectObject:

...

hOldPen:= SelectObject(hCurDC, hCurPen);

Данная функция имеет следующий формат:

...

Function SelectObject(hdc: HDC; hgdiobj: HGDIOBJ): HGDIOBJ;

• hdc – дескриптор контекста устройства;

• hgdiobj – дескриптор на выбираемый объект.

Если выбранный объект не регион и функция выполнилась успешно, то она возвращает дескриптор на объект, который был заменен. Если выбранный объект регион и функция выполнилась успешно, то возвращаемое значение может быть одним из приведенных в табл. 6.2.

Таблица 6.2.

Результат SelectObject для выбранного объекта регион

Если происходит ошибка и выбранный объект не регион, то возвращаемое значение – nil. Иначе – HGDI_ERROR.

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

Проклятый Лекарь. Род III

Скабер Артемий
3. Каратель
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Проклятый Лекарь. Род III

Мастер Разума III

Кронос Александр
3. Мастер Разума
Фантастика:
героическая фантастика
попаданцы
аниме
5.25
рейтинг книги
Мастер Разума III

Измена. Возвращение любви!

Леманн Анастасия
3. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Возвращение любви!

Неудержимый. Книга XI

Боярский Андрей
11. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XI

Сердце Дракона. Том 9

Клеванский Кирилл Сергеевич
9. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.69
рейтинг книги
Сердце Дракона. Том 9

Война

Валериев Игорь
7. Ермак
Фантастика:
боевая фантастика
альтернативная история
5.25
рейтинг книги
Война

Под маской моего мужа

Рам Янка
Любовные романы:
современные любовные романы
5.67
рейтинг книги
Под маской моего мужа

Камень. Книга 3

Минин Станислав
3. Камень
Фантастика:
фэнтези
боевая фантастика
8.58
рейтинг книги
Камень. Книга 3

Измена. Право на счастье

Вирго Софи
1. Чем закончится измена
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на счастье

Газлайтер. Том 12

Володин Григорий Григорьевич
12. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 12

Сиротка

Первухин Андрей Евгеньевич
1. Сиротка
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Сиротка

Охота на эмиссара

Катрин Селина
1. Федерация Объединённых Миров
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Охота на эмиссара

Кодекс Охотника. Книга XV

Винокуров Юрий
15. Кодекс Охотника
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XV

Сердце Дракона. Том 12

Клеванский Кирилл Сергеевич
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Сердце Дракона. Том 12