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