Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programming_Windows_95_Part_I.pdf
Скачиваний:
96
Добавлен:
05.06.2014
Размер:
4.61 Mб
Скачать

158

бледными, потому что их контуры — тонкие линии. Векторные шрифты сейчас иногда называют "плоттерными" (plotter fonts), поскольку они подходят только для плоттеров.

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

Далее рассмотрим шрифты TrueType, которым посвятим остаток главы.

Шрифты TrueType

С введением шрифтов TrueType в версии Windows 3.1 значительно повысились возможности и гибкость работы с текстами. TrueType — это технология контурных шрифтов, которая была разработана Apple Computer Inc. и Microsoft Corporation; она поддерживается многими производителями шрифтов. Отдельные символы шрифтов TrueType определяются контурами, состоящими из прямых линий и кривых. Таким образом, Windows может масштабировать эти шрифты, изменяя определяющие контур координаты. Шрифты TrueType могут быть использованы как для вывода на экран, так и для вывода на принтер, делая реально возможным режим отображения текста WYSIWYG (what-you-see-is-what-you-get, что видите — то и получаете).

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

Windows 95 оснащена 13 шрифтами TrueType. Они имеют следующие имена в соответствии с их видом:

Courier New

Courier New Bold

Courier New Italic

Courier New Bold Italic

Times New Roman

Times New Roman Bold

Times New Roman Italic

Times New Roman Bold Italic

Arial

Arial Bold

Arial Italic

Arial Bold Italic

Symbol

Шрифт Courier New — это фиксированный шрифт (т. е. все символы имеют одинаковую ширину). Он разработан похожим на выводимые данные такого устаревшего устройства, как пишущая машинка. Группа шрифтов Times New Roman — это производные от шрифта Times, впервые разработанного специально для Times of London, и используемого во многих печатных материалах. Они рассчитаны на то, чтобы обеспечить максимальное удобство чтения. Группа шрифтов Arial — это производные от шрифта Helvetica, являющегося рубленым (sans serif) шрифтом. Это означает, что символы не имеют засечек на концах. Шрифт Symbol содержит ряд часто используемых специальных символов.

Обычно вы задаете шрифт путем указания его типового имени и типового размера. Типовой размер выражается в единицах, называемых пунктами. Пункт — это приблизительно 1/72 дюйма, разница настолько несущественна, что в компьютерной полиграфии пункт часто определяют как 1/72 дюйма без всяких оговорок. Текст этой книги напечатан шрифтом типового размера 12 пунктов. Типовой размер иногда определяют как высоту символа от верхней границы букв, имеющих выступающую верхнюю часть, до нижней границы букв, имеющих выступающую нижнюю часть. Это достаточно убедительный способ оценки типового размера, но он не является точным для всех шрифтов. Иногда разработчики шрифтов действуют по-другому.

Система EZFONT

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

159

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

Впредыдущих изданиях этой книги подробно рассматривалась функция EnumFonts, которая предоставляет любой программе структуры LOGFONT (logical font, логический шрифт) и TEXTMETRIC для каждого шрифта GDI, установленного для использования под Windows, и для всех шрифтов устройств. Диалоговое окно ChooseFont (которое подробнее будет рассмотрено в главе 11) делает ненужным использование этой функции и всего, что с ней связано. Также подробно обсуждалась функция CreateFontIndirect, которая позволяет программе описывать создаваемый шрифт без его немедленного именования. Это объясняет то, каким образом шрифты печатающего устройства аппроксимировались на экране монитора.

Вэтой главе вам будет предложено нечто совсем другое. Здесь будет показано, как можно использовать различные стандартные шрифты TrueType в ваших программах наиболее эффективно и одновременно с учетом требований традиционной полиграфии. Для этого надо задать название шрифта (одного из 13, перечисленных выше) и его размер (который будет рассмотрен вскоре). Шрифт назван EZFONT (easy font, простой шрифт). На рис. 4.33 приведены два файла, тексты которых вам потребуются.

EZFONT.H

/*----------------------

EZFONT.H header file

----------------------*/

HFONT EzCreateFont(HDC hdc, char * szFaceName, int iDeciPtHeight, int iDeciPtWidth, int iAttributes, BOOL fLogRes);

#define EZ_ATTR_BOLD

1

#define EZ_ATTR_ITALIC

2

#define EZ_ATTR_UNDERLINE

4

#define EZ_ATTR_STRIKEOUT

8

EZFONT.C

/*---------------------------------------

EZFONT.C -- Easy Font Creation

(c) Charles Petzold, 1996

---------------------------------------*/

#include <windows.h> #include <string.h> #include <math.h> #include "ezfont.h"

HFONT EzCreateFont(HDC hdc, char * szFaceName, int iDeciPtHeight, int iDeciPtWidth, int iAttributes, BOOL fLogRes)

{

FLOAT cxDpi, cyDpi;

HFONT hFont;

LOGFONT lf;

POINT pt;

TEXTMETRIC tm;

SaveDC(hdc);

SetGraphicsMode(hdc, GM_ADVANCED);

ModifyWorldTransform(hdc, NULL, MWT_IDENTITY);

SetViewportOrgEx(hdc, 0, 0, NULL);

SetWindowOrgEx (hdc, 0, 0, NULL);

if(fLogRes)

{

cxDpi =(FLOAT) GetDeviceCaps(hdc, LOGPIXELSX); cyDpi =(FLOAT) GetDeviceCaps(hdc, LOGPIXELSY);

}

else

{

cxDpi =(FLOAT)(25.4 * GetDeviceCaps(hdc, HORZRES) /

160

GetDeviceCaps(hdc, HORZSIZE));

cyDpi =(FLOAT)(25.4 * GetDeviceCaps(hdc, VERTRES) / GetDeviceCaps(hdc, VERTSIZE));

}

pt.x =(int)(iDeciPtWidth * cxDpi / 72); pt.y =(int)(iDeciPtHeight * cyDpi / 72);

DPtoLP(hdc, &pt, 1);

lf.lfHeight

= -(int)(fabs(pt.y) / 10.0 + 0.5);

 

 

lf.lfWidth

= 0;

 

 

 

lf.lfEscapement

= 0;

 

 

 

lf.lfOrientation

= 0;

 

 

 

lf.lfWeight

= iAttributes & EZ_ATTR_BOLD

? 700

: 0;

lf.lfItalic

= iAttributes & EZ_ATTR_ITALIC

?

1

: 0;

lf.lfUnderline

= iAttributes & EZ_ATTR_UNDERLINE ?

1

: 0;

lf.lfStrikeOut

= iAttributes & EZ_ATTR_STRIKEOUT ?

1

: 0;

lf.lfCharSet

= 0;

 

 

 

lf.lfOutPrecision

= 0;

 

 

 

lf.lfClipPrecision

= 0;

 

 

 

lf.lfQuality

= 0;

 

 

 

lf.lfPitchAndFamily

= 0;

 

 

 

strcpy(lf.lfFaceName, szFaceName);

hFont = CreateFontIndirect(&lf);

if(iDeciPtWidth != 0)

{

hFont =(HFONT) SelectObject(hdc, hFont);

GetTextMetrics(hdc, &tm);

DeleteObject(SelectObject(hdc, hFont));

lf.lfWidth =(int)(tm.tmAveCharWidth *

fabs(pt.x) / fabs(pt.y) + 0.5);

hFont = CreateFontIndirect(&lf);

}

RestoreDC(hdc, -1);

return hFont;

}

Рис. 4.33 Файлы EZFONT

Программа EZFONT.C содержит только одну функцию — EzCreateFont — которую вы можете использовать, например, таким образом:

hFont = EzCreateFont(hdc, szFaceName, iDeciPtHeight, iDeciPtWidth, iAttributes, fLogRes);

Функция возвращает описатель шрифта. Шрифт может быть выбран в контекст устройства посредством вызова функции SelectObject. Затем вы можете вызывать функции GetTextMetrics или GetOutlineTextMetrics для определения действительного размера шрифта в логических координатах. Перед окончанием вашей программы необходимо удалить все созданные шрифты, вызвав функцию DeleteObject.

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

161

Третий параметр определяет желаемый размер шрифта в пунктах, но его особенность состоит в том, что он задается в деципунктах (каждый деципункт равен 1/10 пункта). Следовательно, если вы хотите задать размер в пунктах, равный 121/2, используйте значение 125.

Обычно четвертый параметр должен быть установлен в ноль или быть таким же, как третий параметр. Однако, вы можете создать более широкий или более узкий шрифт TrueType, установив другое значение этого параметра. Иногда этот размер называют "эм-шириной" (em-width) шрифта, и он описывает ширину шрифта в пунктах. Не путайте эту величину со средней шириной символов шрифта или с чем-нибудь похожим. На раннем этапе развития типографского дела заглавная буква ‘M’ имела одинаковые ширину и высоту. Так возникла концепция "эмквадрат", а впоследствии и такая мера как "эм-ширина". Когда эм-ширина равна эм-высоте (размеру шрифта в пунктах), то ширины символов установлены такими, какими изначально задумывались разработчиком шрифта. Задание большей или меньшей эм-ширины позволяет вам создавать более широкие или более узкие символы.

Параметр iAttributes может быть установлен в одно из следующих значений, определенных в EZFONT.H:

EZ_ATTR_BOLD

EZ_ATTR_ITALIC

EZ_ATTR_UNDERLINE

EZ_ATTR_STRIKEOUT

Может быть вам и не потребуется использовать значения EZ_ATTR_BOLD или EZ_ATTR_ITALIC, потому что эти атрибуты являются частью полного типового имени шрифта TrueType. Если вы их используете, то Windows синтезирует соответствующие эффекты.

Наконец, вы должны установить в TRUE значение последнего параметра для того, чтобы видимый размер шрифта основывался на логическом разрешении (logical resolution), возвращаемом функцией GetDeviceCaps. В противном случае он базируется на действительном разрешении.

Внутренняя работа

Функция EzCreateFont разработана для использования в системах Windows 95 или Windows NT. Для совместимости с NT используются функции SetGraphicsMode и ModifyWorldTransform, которые никак не влияют на работу Windows 95. (Другими словами, ModifyWorldTransform в Windows NT могла бы оказать влияние на видимый размер шрифта. Поэтому эта функция устанавливается в режим по умолчанию — без преобразования — перед тем, как вычисляется размер шрифта.)

Функция EzCreateFont сначала устанавливает поля структуры LOGFONT и вызывает функцию CreateFont, которая возвращает описатель шрифта. Для выбранных шрифтов TrueType большинство полей может быть установлено в ноль. Вам необходимо установить значения следующих полей:

lfHeight — это желаемая высота символов (включая поле, отведенное для специальных знаков над символами, но не включая поле, установленное для межстрочного интервала) в логических единицах. Поскольку размер шрифта в пунктах — это и есть высота шрифта без величины поля, отведенного для специальных знаков над символами, то здесь вы на самом деле определяете значение межстрочного интервала. Вы можете установить значение lfHeight равным 0 для задания размера по умолчанию. Если вы зададите значение lfHeight отрицательным числом, Windows использует абсолютное значение этого числа в качестве желаемого размера высоты шрифта, а не как межстрочный интервал. Если вы хотите задать конкретное значение размера в пунктах, его надо преобразовать в логические единицы, и поле lfHeight установить в отрицательное значение результата.

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

lfWeight — это поле позволяет вам задать полужирный шрифт путем установки значения, равного 700.

lfItalic — ненулевое значение поля определяет курсив.

lfUnderline — ненулевое значение поля задает подчеркивание.

lfStrikeOut — ненулевое значение поля определяет шрифт с зачеркиванием символов.

lfFaceName (массив типа BYTE) — это имя шрифта (например, Courier New, Arial или Times New Roman).

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

Вызов функции GetDeviceCaps c параметрами HORZRES и VERTRES дает нам ширину и высоту экрана (или области печати выводимой на принтере страницы) в пикселях. Вызов функции GetDeviceCaps c параметрами HORZSIZE и VERTSIZE дает нам физическую ширину и высоту экрана (или области печати выводимой на

Соседние файлы в предмете Операционные системы