Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСиСП. Часть 2. Контрольная работа 1.doc
Скачиваний:
41
Добавлен:
01.04.2014
Размер:
202.24 Кб
Скачать

1.3.2. Функции для работы со шрифтами

Для вывода текста нужно выбрать шрифт в контекст устройства с помощью функции

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 нельзя выбирать стиль шрифта.

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