Функции для работы со шрифтами
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

 

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

SelectObject( hDC, hFont );

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

int GetTextFace( hDC, nMaxBuffer, lpsBuffer );

int GetObject( hFont, sizeof(LOGFONT), &stLogfont );

Функция GetTextFace() заполняет указанный буфер именем применяемого шрифта, а функция GetObject() позволяет заполнить структуру LOGFONT информацией о конкретном шрифте.

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

Это можно осуществить двумя разными способами - Вы можете перебирать все шрифты и выбрать из них нужный Вам (например создать меню, содержащее имена шрифтов), или Вы можете воспользоваться функцией ChooseFont() для вызова стандартного диалога выбора шрифта.

Сначала мы разберемся с основными правилами перебора шрифтов. В Windows для этих целей существует две функции:

int EnumFonts( hDC, lpszFace, lpfnEnumProc, lParam );

int EnumFontFamilies( hDC, lpszFace, lpfnEnumProc, lParam );

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

Разница связана с тем, что TrueType шрифты обычно существуют в нескольких вариантах, отличающихся начертанием (жирный, наклонный и др.). Эти варианты существуют как отдельные шрифты, поэтому функция EnumFonts() перечисляет один и тот–же TrueType шрифт несколько раз, соответственно с количеством разных начертаний. Функция EnumFontFamilies() перебирает только по одному начертанию каждого TrueType шрифта.

Для каждого перечисляемого шрифта вызывается функция lpfnEnumProc(), которой передается структуры типа LOGFONT и TEXTMETRIC (функция EnumFontFamilies() передает структуры NEWLOGFONT и NEWTEXTMETRIC, содержащие дополнительные данные), номер типа шрифта (DEVICE_FONTTYPE, RASTER_FONTTYPE или TRUETYPE_FONTTYPE) и параметр lParam, который Вы указали для функции EnumFonts() или EnumFontFamilies().

Общий вид функции, вызываемой при переборе шрифтов, следующий:

int CALLBACK _export EnumFontProc( lpLF, lpTM, nType, lParam );

int CALLBACK _export EnumFontFamProc( lpNLF, lpNTM, nType, lParam );

Параметры:

lpLF является дальним адресом структуры LOGFONT

lpNLF является дальним адресом структуры NEWLOGFONT

lpTM является дальним адресом структуры TEXTMETRIC

lpNTM является дальним адресом структуры NEWTEXTMETRIC

nType указывает тип шрифта

lParam дополнительный параметр, определяемый Вами.

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

Во многих случаях удобнее, однако, не перебирать шрифты, а воспользоваться каким-либо диалогом для выбора нужного шрифта. Это можно сделать с помощью функции ChooseFont(), описанной в файле COMMDLG.H.

Файл COMMDLG.H содержит описания нескольких функций и структур данных, позволяющих вызывать “диалоги общего пользования” (COMMon DiaLoGs). Помимо файла COMMDLG.H Вы должны включить в Ваше приложение файл COMMDLG.LIB, с помощью которого осуществляется связывание Вашего приложения с динамической библиотекой COMMDLG.DLL, содержащей требуемые функции.

Функция, вызывающая диалог для выбора шрифта выглядит следующим образом:

BOOL ChooseFont( lpChooseFont );

причем параметр lpChooseFont указывает на структуру типа CHOOSEFONT:

typedef struct tagCHOOSEFONT { /* cf */

DWORD lStructSize; // = sizeof(CHOOSEFONT)

HWND hwndOwner;

HDC hDC; // используется только для принтера

LOGFONT FAR* lpLogFont;

int iPointSize;

DWORD Flags;

COLORREF rgbColors;

LPARAM lCustData;

UINT (CALLBACK* lpfnHook)(HWND, UINT, WPARAM, LPARAM);

LPCSTR lpTemplateName;

HINSTANCE hInstance;

LPSTR lpszStyle;

UINT nFontType;

int nSizeMin;

int nSizeMax;

} CHOOSEFONT;

Вы должны заполнить нужные поля этой структуры и вызвать функцию ChooseFont() для выбора нужного шрифта. Функция возвращает результат TRUE (не 0), если шрифт был выбран, или FALSE (0), если была нажата кнопка “Cancel”.

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

по устройствам:

CF_PRINTERFONTS шрифты принтера (Вы должны указать hDC принтера)

CF_SCREENFONTS дисплейные шрифты

CF_BOTH все

по типам шрифтов:

CF_TTONLY только TrueType

CF_NOVECTORFONTS растровые и TrueType

CF_SCALABLEONLY векторные, TrueType и некоторые шрифты принтера

CF_WYSIWYG шрифты, используемые и дисплеем и принтером. (вместе с CF_WYSIWYG надо установить CF_BOTH|CF_SCALABLEONLY)

по кодировке:

CF_ANSIONLY только ANSI шрифты

CF_NOOEMFONTS все шрифты кроме OEM

по особенностям

CF_FIXEDPITCHONLY только моноширинные шрифты

CF_FORCEFONTEXIST шрифт с выбранными атрибутами должен существовать (не допускается автоматическое преобразование) по размеру

CF_LIMITSIZE установив этот флаг Вы должны задать поля nSizeMin и nSizeMax, которые определят допустимые размеры шрифтов.

А также Вы можете несколько видоизменять диалог:

по наличию кнопок:

CF_APPLY присутствует кнопка “Apply” (Применить)

CF_USEHELP присутствует кнопка “Help” (Справка)

по правилам инициализации:

CF_INITTOLOGFONTSTRUCT использовать данные структуры LOGFONT (указанной в CHOOSEFONT) для инициализации диалога

по возможности выбирать параметры:

CF_EFFECTS диалог позволит установить стили подчеркивание (underline) и перечеркивание (overstrike)

CF_NOFACESEL нельзя выбирать имя шрифта из списка

CF_NOSIMUALTIONS запрещена имитация шрифта с помощью GDI

CF_NOSIZESEL нельзя выбирать размер шрифта

CF_NOSTYLESEL нельзя выбирать стиль шрифта.

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

 


2. Шрифты в качестве ресурсов


Дата: 2019-07-25, просмотров: 186.