Шаг 139 - Перебор шрифтов

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

int EnumFontFamiliesEx
(  
	HDC hdc,				//  указатель на DC
	LPLOGFONT lpLogfont,		// информация о шрифте
	FONTENUMPROC lpEnumFontFamExProc,	// функция обратного вызова
	LPARAM lParam,			// дополнительные данные
	DWORD dwFlags			// не используеться.
);

Функцию обратного вызова нужно правильно оформить. Вот ее прототип:

int CALLBACK EnumFontFamExProc
(
	ENUMLOGFONTEX *lpelfe,	// логические данные шрифта
	NEWTEXTMETRICEX *lpntme,	// физические данные шрифта
	DWORD FontType,		// тип шрифта
	LPARAM lParam		// данные приложения
);

Ну и теперь полный пример:

#include "stdafx.h"
#include "afxwin.h"
#include "afxdlgs.h"
#include "iostream.h"

int CALLBACK EnumFontFamExProc(
	ENUMLOGFONTEX *lpelfe,
	NEWTEXTMETRICEX *lpntme,
	DWORD FontType,
	LPARAM lParam
);

void main()
{
	HWND hwnd=GetDesktopWindow();	// получить окно
	HDC hdc=GetDC(hwnd);		// связанный DC
	LOGFONT  lf;
	lf.lfFaceName[0] = '\0';
	lf.lfCharSet = DEFAULT_CHARSET;	// все шрифты
	EnumFontFamiliesEx(hdc,&lf,(FONTENUMPROC)EnumFontFamExProc,
		(LPARAM) 0,(DWORD) 0);
	ReleaseDC(hwnd,hdc);
}

int CALLBACK EnumFontFamExProc(ENUMLOGFONTEX *lpelfe,
	NEWTEXTMETRICEX *lpntme,DWORD FontType,LPARAM lParam)
{
	cout <<  lpelfe->elfLogFont.lfFaceName << endl;
	return true;
}

Мы не стали специализировать какие нужны шрифты а просто запросили все.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 22.08.2001