На главную

On-line справка по Win32 API

Написать письмо
БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО!
Список всех статей A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z | Скачать Вниз

Enumerating the Installed Fonts



In some instances, an application must be able to enumerate the available fonts and select the one most appropriate for a particular operation. An application can enumerate the available fonts by calling the EnumFonts or EnumFontFamilies function. These functions send information about the available fonts to a callback function that the application supplies. The callback function receives information in LOGFONT and NEWTEXTMETRIC structures. (The NEWTEXTMETRIC structure contains information about a TrueType font. When the callback function receives information about a non-TrueType font, the information is contained in a TEXTMETRIC structure.) By using this information, an application can limit the user's choices to only those fonts that are available.

The EnumFontFamilies function is similar to the EnumFonts function but includes some extra functionality. EnumFontFamilies allows an application to take advantage of styles available with TrueType fonts. New and upgraded applications should use EnumFontFamilies instead of EnumFonts.
In previous versions of Windows, the only style attributes were weight and italic; any other styles were specified in the family name for the font. For example, when an application used the EnumFonts function to query the available Courier fonts, EnumFonts might return information for Courier, Courier Bold, Courier Bold Italic, and Courier Italic. It would not return information about any other Courier fonts that might be installed, because any other Courier fonts would typically have a different family name.

TrueType fonts are organized around a typeface name (for example, Courier New) and style names (for example, italic, bold, and extra-bold). The EnumFontFamilies function enumerates all the styles associated with a given family name, not simply the bold and italic attributes. For example, when the system includes a TrueType font called Courier New Extra-Bold, EnumFontFamilies lists it with the other Courier New fonts. The capabilities of EnumFontFamilies are helpful for fonts with many or unusual styles and for fonts that cross international borders.

If an application does not supply a typeface name, the EnumFonts and EnumFontFamilies functions supply information about one font in each available family. To enumerate all the fonts in a device context, the application can specify NULL for the typeface name, compile a list of the available typefaces, and then enumerate each font in each typeface.
The following example uses the EnumFontFamilies function to retrieve the number of available raster, vector, and TrueType font families.

UINT uAlignPrev;
int aFontCount[] = { 0, 0, 0 };
char szCount[8];

EnumFontFamilies(hdc, (LPCTSTR) NULL,
(FONTENUMPROC) EnumFamCallBack, (LPARAM) aFontCount);

uAlignPrev = SetTextAlign(hdc, TA_UPDATECP);

MoveToEx(hdc, 10, 50, (LPPOINT)NULL);
TextOut(hdc, 0, 0, "Number of raster fonts: ", 24);
itoa(aFontCount[0], szCount, 10);
TextOut(hdc, 0, 0, szCount, strlen(szCount));

MoveToEx(hdc, 10, 75, (LPPOINT)NULL);

TextOut(hdc, 0, 0, "Number of vector fonts: ", 24);
itoa(aFontCount[1], szCount, 10);
TextOut(hdc, 0, 0, szCount, strlen(szCount));

MoveToEx(hdc, 10, 100, (LPPOINT)NULL);
TextOut(hdc, 0, 0, "Number of TrueType fonts: ", 26);
itoa(aFontCount[2], szCount, 10);
TextOut(hdc, 0, 0, szCount, strlen(szCount));

SetTextAlign(hdc, uAlignPrev);
.
.
.

BOOL FAR PASCAL EnumFamCallBack(lplf, lpntm, FontType, aFontCount)

LPLOGFONT lplf;
LPNEWTEXTMETRIC lpntm;
DWORD FontType;
LPVOID aFontCount;
{
int far * aiFontCount = (int far *) aFontCount;

/*
* Record the number of raster, TrueType, and vector
* fonts in the font-count array.
*/

if (FontType & RASTER_FONTTYPE)
aiFontCount[0]++;
else if (FontType & TRUETYPE_FONTTYPE)
aiFontCount[2]++;
else
aiFontCount[1]++;

if (aiFontCount[0] || aiFontCount[1] || aiFontCount[2])

return TRUE;
else
return FALSE;

UNREFERENCED_PARAMETER( lplf );
UNREFERENCED_PARAMETER( lpntm );
}


This example uses two masks, RASTER_FONTTYPE and TRUETYPE_FONTTYPE, to determine the type of font being enumerated. If the RASTER_FONTTYPE bit is set, the font is a raster font. If the TRUETYPE_FONTTYPE bit is set, the font is a TrueType font. If neither bit is set, the font is a vector font. A third mask, DEVICE_FONTTYPE, is set when a device (for example, a laser printer) supports downloading TrueType fonts; it is zero if the device is a display adapter, dot-matrix printer, or other raster device. An application can also use the DEVICE_FONTTYPE mask to distinguish GDI-supplied raster fonts from device-supplied fonts. Windows can simulate bold, italic, underline, and strikeout attributes for GDI-supplied raster fonts, but not for device-supplied fonts.

An application can also check bits 1 and 2 in the tmPitchAndFamily member of the NEWTEXTMETRIC structure to identify a TrueType font. If bit 1 is 0 and bit 2 is 1, the font is a TrueType font.
Vector fonts are categorized as OEM_CHARSET instead of ANSI_CHARSET. Some applications identify vector fonts by using this information, checking the tmCharSet member of the NEWTEXTMETRIC structure. This categorization usually prevents the font mapper from choosing vector fonts unless they are specifically requested. (Most applications no longer use vector fonts because their strokes are single lines and they take longer to draw than TrueType fonts, which offer many of the same scaling and rotation features that required vector fonts in earlier versions of Windows.)


Пригласи друзей и счет твоего мобильника всегда будет положительным!
Предыдущая статья
 
Сайт Народ.Ру Интернет
Следующая статья
Пригласи друзей и счет твоего мобильника всегда будет положительным!

Перечисляющие Включенные Шрифты



В некоторых примерах, приложение должно быть способным перечислить доступные шрифты и выбраться один наиболее подходящий для конкретного действия. Приложение может перечислить доступные шрифты вызывая EnumFonts или функция EnumFontFamilies. Эти функции посылают информацию о доступных шрифтах в функцию возврата, что приложение поставляет. Функция возврата получает информацию в LOGFONT и структурах NEWTEXTMETRIC. ( Структура NEWTEXTMETRIC содержит информацию о шрифте TrueType. Когда функция возврата получает информацию о не-шрифте TrueType, информация содержалась в структуре TEXTMETRIC.) Используя эту информацию, приложение может ограничить выборы пользователя в только те шрифты, которые доступны.

Функция EnumFontFamilies подобная EnumFonts функционировать но включает немного дополнительное функциональное назначение. EnumFontFamilies ПОЗВОЛЯЕТ приложение, чтобы иметь преимущество перед стилями доступными с шрифтами TrueType. Новые и модернизированные приложения должны использовать EnumFontFamilies вместо EnumFonts.
В предшествующих версиях Windows, единственные атрибуты стиля были весом и курсивом; любые другие стили были определены в фамилии для шрифта. Например, когда приложение использовало функцию EnumFonts на запрос доступные шрифты Курьера, EnumFonts мог возвращать информации для Курьера, Жирного шрифта Курьера, Смелого Курсива Курьера, и Курсива Курьера. Это не захочет возвращать информацию о любых других шрифтах Курьера, которые могли быть установлены, поскольку любые другие шрифты Курьера должны обычно иметь другую фамилию.

ШРИФТЫ TrueType организованы вокруг типа шрифта имени (например, Курьер Новый) и имена стиля (например, курсив, жирный шрифт, и дополнительный-жирный шрифт). Функция EnumFontFamilies перечисляет все стили связанные данной фамилией, просто не смелые и атрибуты курсива. Например, когда система включает шрифт TrueType назвавший Courier New Extra-Bold, списки EnumFontFamilies это с другими Новыми шрифтами Курьера. Возможности EnumFontFamilies полезные для шрифтов с много или необычными стилями и для шрифтов, которые пересекают международные границы.

Если приложение не поставляет тип шрифта имени, EnumFonts и информация поставки функций EnumFontFamilies об одном шрифте в каждом доступном семействе. Для того, чтобы перечислять все шрифты в контексте устройства, приложение может определить НЕДЕЙСТВИТЕЛЬНЫЙ для типа шрифта имени, компилируйте список доступных типов шрифта, затем перечислите каждый шрифт в каждом типе шрифта.
Следующий пример использует функцию EnumFontFamilies, чтобы извлекать номер доступного растра, вектора, и шрифтовые семейства TrueType.

UINT uAlignPrev;
int aFontCount[] = { 0, 0, 0 };
символ szCount[8];

EnumFontFamilies(hdc, (LPCTSTR) НЕДЕЙСТВИТЕЛЬНЫЙ, (FONTENUMPROC) EnumFamCallBack, (LPARAM) aFontCount);

uAlignPrev = SetTextAlign(hdc, TA_UPDATECP);

MoveToEx(hdc, 10, 50, (LPPOINT)NULL);
TextOut(hdc, 0, 0, "КОЛИЧЕСТВО растровых шрифтов: ", 24);
itoa(aFontCount[0], szCount, 10);
TextOut(hdc, 0, 0, szCount, strlen(szCount));

MoveToEx(hdc, 10, 75, (LPPOINT)NULL);

TextOut(hdc, 0, 0, "КОЛИЧЕСТВО векторных шрифтов: ", 24);
itoa(aFontCount[1], szCount, 10);
TextOut(hdc, 0, 0, szCount, strlen(szCount));

MoveToEx(hdc, 10, 100, (LPPOINT)NULL);
TextOut(hdc, 0, 0, "ЧИСЛО шрифтов TrueType: ", 26);
itoa(aFontCount[2], szCount, 10);
TextOut(hdc, 0, 0, szCount, strlen(szCount));

SetTextAlign(hdc, uAlignPrev);
.
.
.

BOOL ЗНАЧИТЕЛЬНО PASCAL EnumFamCallBack(lplf, lpntm, FontType, aFontCount)

LPLOGFONT lplf;
LPNEWTEXTMETRIC lpntm;
DWORD FontType;
LPVOID aFontCount;
{
int значительно * aiFontCount = (int значительно *) aFontCount;

/*
* Запишите номер растра, TrueType, и вектора
* шрифты в шрифте-считают массивом.
*/

если (FontType & RASTER_FONTTYPE) aiFontCount[0]++;
еще если (FontType & TRUETYPE_FONTTYPE) aiFontCount[2]++;
еще
aiFontCount[1]++;

если (aiFontCount[0] || aiFontCount[1] || aiFontCount[2])

возвращайтесь ВЕРНО;
еще
обратная ЛОЖЬ;

UNREFERENCED_PARAMETER( lplf );
UNREFERENCED_PARAMETER( lpntm );
}


Этот пример использует две маски, RASTER_FONTTYPE и TRUETYPE_FONTTYPE, чтобы определять тип шрифта, перечислянного. Если бит RASTER_FONTTYPE установлен, шрифт является растровым шрифтом. Если бит TRUETYPE_FONTTYPE установлен, шрифт является шрифтом TrueType. Если никакой бит не установлен, шрифт является векторным шрифтом. Третья маска, DEVICE_FONTTYPE, установлена когда устройство опор (например, лазерный принтер), загружающий шрифты TrueType; это - нуль если устройство - дисплейный адаптер, точечный-матричный принтер, или другое растровое устройство. Приложение может также использовать маску DEVICE_FONTTYPE, чтобы отличать поставленные растровые шрифты GDI от поставленных шрифтов устройства. Windows может сымитировать жирный шрифт, курсив, подчеркивать, и разрядка приписывается для поставленных растровых шрифтов GDI, но не для поставленных шрифтов устройства.

Приложение может также проверить битам 1 и 2 в tmPitchAndFamily элементе структуры NEWTEXTMETRIC, чтобы идентифицировать шрифт TrueType. Если бит 1 - 0 и бит 2 - 1, шрифт является шрифтом TrueType.
Векторные шрифты распределены как OEM_CHARSET вместо ANSI_CHARSET. Некоторые приложения идентифицируют векторные шрифты используя эту информацию, проверяя элемент tmCharSet структуры NEWTEXTMETRIC. Эта классификация обычно предохраняет шрифтовое mapper чтобы выбирать векторные шрифты если они особо не запрошены. (Большинство приложений больше векторные шрифты использования поскольку их штрихи являются линейными линиями и, они берут более длинный, чтобы делать чем шрифты TrueType, которые предлагают многое то же масштабирование и вращение представляет, что необходимые векторные шрифты в более ранних версиях Windows.)


Вверх Version 1.3, Oct 26 2010 © 2007, 2010, mrhx Вверх
 mrhx software  Русский перевод OpenGL  Русский перевод Win32 API
 
Используются технологии uCoz