Опубликован: 15.11.2010 | Доступ: свободный | Студентов: 643 / 18 | Оценка: 4.00 / 5.00 | Длительность: 17:30:00
Специальности: Программист
Лекция 12:

Вывод текста на экран и устройство в Windows

12.8. Приложение № II. Атрибуты и функции визуализации метрик шрифтов в Windows

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

  • шрифты с фиксированной шириной букв (fixed) и "пропорциональные гарнитуры" (proportional);
  • шрифты с засечками (Serif, Roman) и "рубленые гарнитуры" (Sans Serif);

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

В Windows, кроме того, все шрифты можно разделить по технологии изготовления на "растровые", "контурные" ("векторные") и масштабируемые (изготовленные с помощью разных технологий, например: True Type Fonts, Open Type Fonts, Adobe Type I). Растровые шрифты состоят из отдельных пикселей, и используются при выводе текста на экран монитора или на принтер. Для обеспечения приемлемого качества текста в Windows имеется набор растровых шрифтов с одной гарнитурой, но разным кеглем. Если попытаться выполнить масштабирование растрового шрифта в сторону увеличения размера литер, наклонные линии и закругления будут изображаться в виде "лестницы".

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

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

В примерах данного курса мы будем использовать так называемый системный шрифт, используемый как шрифт по-умолчанию для операционных систем Microsoft Windows. Обозначается он как SYSTEM_FONT. Системный шрифт относят к растровым шрифтам с рубленной пропорциональной гарнитурой. По-умолчанию это гарнитура MS Sans Serif.

Переменная ширина букв усложняет задачу вывода текста, так как длина текстовой строки зависит не только от количества букв в строке, но и от того, из каких литер состоит строка. Для подсчёта длины текстовой строки в пикселях предназначена функция GetTextExtent, описанная в Приложении № I(пункт 12.7) к данной лекции.

Для получения информации о шрифте, выбранном в контекст устройства, предназначена функция GetTextMetrics. Её описание смотри ниже.

ФУНКЦИЯ GETTEXTMETRICS
ОПРЕДЕЛЕНА В: <windows.h>
СИНТАКСИС: BOOL WINAPI GetTextMetrics( hdc, lptm ), где
  • HDC hdc - указывает на контекст устройства, для которого требуется получить информацию о метриках шрифта;
  • TEXTMETRIC FAR* lptm - дальний указатель на структуру TEXTMETRIC, в которую будет записана информация о метриках шрифта для указанного контекста устройства;
НАЗНАЧЕНИЕ: Получает информацию о метриках шрифта для указанного контекста;
ОПИСАНИЕ:
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: TRUE в случае успешного завершения, и FALSE в противном случае;
ПЕРЕНОСИМОСТЬ: Только Windows;

Структура TEXTMETRIC описана в файле windows.h следующим образом:

typedef struct tagTEXTMETRIC
{
  int  tmHeight;
  int  tmAscent;
  int  tmDescent;
  int  tmInternalLeading;
  int  tmExternalLeading;
  int  tmAveCharWidth;
  int  tmMaxCharWidth;
  int  tmWeight;
  BYTE  tmItalic;
  BYTE  tmUnderlined;
  BYTE  tmStruckOut;
  BYTE  tmFirstChar;
  BYTE  tmLastChar;
  BYTE  tmDefaultChar;
  BYTE  tmBreakChar;
  BYTE  PitchAndFamily;
  BYTE  tmCharSet;
  int  tmOverhang;
  int  tmDigitizedAspectX;
  int  tmDigitizedAspectY;
} TEXTMETRIC;

Описание этих полей смотрите в таблице 12.3.

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

Пример функций для определения параметров шрифта по-умолчанию и вывода текста с указанными метриками приведён ниже. Следует отметить, что эти функции используют глобальные переменные nXChar, nYChar, nXCurrentPosition, nYCurrentPosition, ps, tm, nMaxNumLines, nMaxLenngthLines, nScrollPos и др.

Таблица 12.3. Описание полей структуры TEXTMETRIC
Поле Описание
int tmHeight Равна сумме значений tmAscent и tmDescent, и равна высоте шрифта.
int tmAscent Представляет собой высоту символов от базовой линии до верха приписных букв, с учётом таких элементов, как тильда в букве: "Й".
int tmDescent Определяет пространство, занимаемое буквами ниже базовой линии.
int tmInternalLeadiing Определяет размер выступающих элементов букв (например, тильда в букве "Й"). Эта величина может быть равна нулю.
int tmExternalLeading Определяет минимальный межстрочный интервал, рекомендуемый разработчиком шрифта.
int tmAveCharWidth Содержит в себе среднее значение ширины строчных букв шрифта. Это значание приблизительно равно ширине латинской буквы: "x".
int tmMaxCharWidth Определяет ширину самой широкой букве в шрифте. Для моноширинной гарнитуры это значение совпадает со значением tmAveCharWidth.
int tmWeight
BYTE tmItalic
BYTE tmUnderlined
BYTE tmStruckOut
BYTE tmFirstChar
BYTE tmLastChar
BYTE tmDefaultChar
BYTE tmBreakChar
BYTE tmPitchAndFamily
BYTE tmCharSet
int tmOverhang
int tmDigitizedAspectX
int tmDigitizedAspectY

Примечание: в данных примерах используется вертикальная полоса прокрутки окна. Более подробно о полосах прокрутки смотри в приложении № IV к данной лекции.

12.9. Приложение № III

ФУНКЦИЯ MESSAGEBOX
ОПРЕДЕЛЕНА В: <windows.h>
СИНТАКСИС: int WINAPI MessageBox( hwndParent, lpszText, lpszTitle, fuStyle ), где
  • HWND hwndParent - идентификатор родительского окна, создающего диалоговую панель;
  • LPSTR lpszText - дальний указатель на строку текста, выводимую в рабочую область диалоговой панели;
  • LPSTR lpszTitle - дальний указатель на строку текста, отображающейся в заголовке диалогового окна;
  • UINT fuStyle - флаг, определяющий стиль и внешний вид диалоговой панели. Константы, определяющие эти флаги, находятся в таблице 12.4;
НАЗНАЧЕНИЕ: Функция выводит диалоговую панель с сообщением, заданным пользователем;
ОПИСАНИЕ: Функция MessageBox создаёт на экране диалоговую панель с текстом, заданным параметром: lpszText и заголовком, заданным параметром lpszTitle. Если заголовок указан как NULL, используется заголовок по умолчанию - строка "Error". Параметр hwndParent указывает идентификатор родительского окна, создающего диалоговую панель. Этот параметр можно указать как NULL, тогда у диалоговой панели не будет рабочего окна. Вы также можете вызвать функцию из MessageBox из функции диалога, в этом случае этот параметр должен содержать идентификатор окна диалоговой панели.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Одна из следующих констант, определённых в таблице 12.5;
ПЕРЕНОСИМОСТЬ: Только Windows.

Таблица 12.4. Флаги стиля и внешнего вида диалоговых полей функции MessageBox
Флаг Описание
Количество и тип кнопок
MB_ABORTRETRYIGNORE Диалоговое окно содержит три кнопки с надписями: "Abort", "Retry", "Ignore".
MB_OK Диалоговое окно содержит одну кнопку "Ok".
MB_OKCANCEL Панель содержит две кнопки с надписями "Ok", "Cancel".
MB_RETRYCANCEL Панель содержит две кнопки с надписями "Retry, Cancel".
MB_YESNO Панель содержит две кнопки с надписями: "Yes", "No".
MB_YESNOCANCEL Панель содержит три кнопки с надписями: "Yes", "No", "Cancel".
Номер кнопки по-умолчанию
MB_DEFBUTTON1 Первая кнопка используется по-умолчанию.
MB_DEFBUTTON2 Вторая кнопка используется по-умолчанию.
MB_DEFBUTTON3 Третья кнопка используется по-умолчанию.
Управление модальностью диалоговой панели
MB_APPLMODAL Cоздаётся модальная диалоговая панель. Окно, указанное параметром hwndParent, преводится в неактивное состояние до тех пор, пока пользователь не завершит работу с диалоговой панелью. Пользователь может переключиться на другое приложение. Этот стиль используется по-умолчанию.
MB_SYSTEMMODAL Пока не завершиться работа с диалоговой панелью, все остальные приложения переводятся в неактивое состояние.
MB_TASKMODAL Аналогично MB_APPLMODAL, за исключением того, что если параметр hwndParent имеет значение NULL, блокируются все окна верхнего уровня, принадлежащие заданной задаче. Этот стиль используется тогда, когда идентификатор родительского окна неизвестен, но тем не менее требуется перевести все окна текущего приложения в неактивное состояние до тех пор, пока пользователь не завершит работу с диалоговой панелью.
Создание пиктограммы:
MB_ICONASTERISK Буква "i" на синем фоне
MB_ICONEXCLAMATION Восклицательный знак в жёлтом круге.
MB_ICONHAND Надпись: "STOP" на красном фоне (как автомобильный знак).
MB_ICONINFORMATION Буква "i" на синем фоне
MB_ICONQUESTION Знак вопроса в зелёном круге.
MB_ICONSTOP Надпись: "STOP" на красном фоне (как автомобильный знак).
Таблица 12.5. Возвращаемые значения функции MessageBox
Константа Описание
IDABORT Нажата клавиша: "Abort".
IDCANCEL Нажата клавиша: "Cancel".
IDIGNORE Нажата клавиша: "Ignore".
IDNO Нажата клавиша: "No".
IDOK Нажата клавиша: "Ok".
IDRETRY Нажата клавиша: "Retry".
IDYES Нажата клавиша: "Yes".
Дмитрий Карпов
Дмитрий Карпов
Россия, Нижний Новгород
Олег Корсак
Олег Корсак
Латвия, Рига