Перебор шрифтов

У нас есть возможность самостоятельно перебрать шрифты, которые установлены в системе. Для этого существует функция 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;
}

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

 
« Предыдущая статья   Следующая статья »