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

на главную - закладки

Жанры

Шрифт:

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

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

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

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.

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

Развод с генералом драконов

Солт Елена
Фантастика:
фэнтези
5.00
рейтинг книги
Развод с генералом драконов

Личный аптекарь императора. Том 3

Карелин Сергей Витальевич
3. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Личный аптекарь императора. Том 3

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

Винокуров Юрий
27. Кодекс Охотника
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XXVII

Глэрд IX: Легионы во Тьме

Владимиров Денис
9. Глэрд
Фантастика:
боевая фантастика
попаданцы
фэнтези
5.00
рейтинг книги
Глэрд IX: Легионы во Тьме

Первый среди равных. Книга X

Бор Жорж
10. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Первый среди равных. Книга X

Студиозус

Шмаков Алексей Семенович
3. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Студиозус

Рубежник

Билик Дмитрий Александрович
1. Бедовый
Фантастика:
юмористическая фантастика
городское фэнтези
мистика
5.00
рейтинг книги
Рубежник

Черные ножи

Шенгальц Игорь Александрович
1. Черные ножи
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черные ножи

Варяг

Мазин Александр Владимирович
1. Варяг
Фантастика:
альтернативная история
9.10
рейтинг книги
Варяг

Идеальный мир для Лекаря 12

Сапфир Олег
12. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 12

Дворянская кровь

Седой Василий
1. Дворянская кровь
Фантастика:
попаданцы
альтернативная история
7.00
рейтинг книги
Дворянская кровь

Первый среди равных

Бор Жорж
1. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных

Аристократ из прошлого тысячелетия

Еслер Андрей
3. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Аристократ из прошлого тысячелетия

Идеальный мир для Лекаря 17

Сапфир Олег
17. Лекарь
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 17