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