EnumFontFamiliesEx() 関数を使うことで、
フォント名を得ることができます。
int EnumFontFamiliesExW(
[in] HDC hdc,
[in] LPLOGFONTW lpLogfont,
[in] FONTENUMPROCW lpProc,
[in] LPARAM lParam,
DWORD dwFlags
);
パラメータについて
1. [in] LPLOGFONTW lpLogfont
LPLOGFONT構造体へのポインターです。
関数では、この構造体の次のメンバーを調べます。
lfCharSet
DEFAULT_CHARSETに設定すると、関数はすべての文字セット内のすべての一意の名前付きフォントを列挙します。
ANSI_CHARSET(欧文)、SHIFTJIS_CHARSET(日本語)などがあります。
lfFaceName
空の文字列に設定すると、使用可能な各書体名に 1 つのフォントが列挙されます。 有効な書体名に設定すると、指定した名前のすべてのフォントが列挙されます。
lfPitchAndFamily
0である必要があります。
2.FONTENUMPROCW lpProc
フォント情報を受け取るコールバック関数へのポインター。
コールバック関数としてEnumFontFamExProc関数を定義する必要があります。
この関数の宣言は、
int CALLBACK EnumFontFamExProc(
const LOGFONT *lpelfe,
const TEXTMETRIC *lpntme,
DWORD FontType,
LPARAM lParam
);
パラメータについて
2.1 LOGFONT *lpelfe
LOGFONT構造体へのポインター。ENUMLOGFONTEXW構造体かENUMLOGFONTEXDV構造体にキャストすることができます。
2.1.1 ENUMLOGFONTEXW構造体について
ENUMLOGFONTEX 構造体には、列挙フォントに関する情報が含まれています。
typedef struct tagENUMLOGFONTEXW {
LOGFONTW elfLogFont;
WCHAR elfFullName[LF_FULLFACESIZE];
WCHAR elfStyle[LF_FACESIZE];
WCHAR elfScript[LF_FACESIZE];
} ENUMLOGFONTEXW, *LPENUMLOGFONTEXW;
パラメータについて
2.1.1.1 LOGFONTW elfLogFont
フォント属性を定義する値を含む LOGFONT 構造体。
2.1.1.2 WCHAR elfFullName[LF_FULLFACESIZE]
フォントの一意の名前。メイリオとか
2.1.1.3 WCHAR elfStyle[LF_FACESIZE]
フォントのスタイル。 たとえば、太字の斜体などです。
2.1.1.4 WCHAR elfScript[LF_FACESIZE]
フォントのスクリプト、つまり文字セット。日本語とか
2.2 TEXTMETRIC *lpntme
フォントの物理属性に関する情報を含む構造体へのポインター
2.3 DWORD FontType
フォントのタイプ。このパラメータは、次の値の組合せになります。
DEVICE_FONTTYPE:デバイスフォント
RASTER_FONTTYPE:ラスターフォント
TRUETYPE_FONTTYPE:TrueTypeフォント
2.4 LPARAM lParam
EnumFontFamiliesEx関数によって渡されるアプリケーション定義のデータ。
2.5 戻り値
列挙を継続するには、戻り値をゼロ以外の値にする必要があります。列挙を停止するには、戻り値をゼロにする必要があります。
3. [in] LPARAM lParam,
アプリケーション定義値。 関数は、この値をフォント情報と共にコールバック関数に渡します。
4. DWORD dwFlags
このパラメーターは使われていないので、0 にする必要があります。
〇プログラム例
リストボックスに日本語のフォント名を表示します。
#include <windows.h>
#include <strsafe.h>
int CALLBACK EnumFontFamExProc(const ENUMLOGFONTEX* lpelf, const TEXTMETRIC* lpntme, DWORD FontType, LPARAM lParam) {
TCHAR pszDest[100];
size_t cchDest = 100;
LPCWSTR ft = TEXT("");
switch (FontType) {
case DEVICE_FONTTYPE:
ft = TEXT("デバイスフォント");
break;
case RASTER_FONTTYPE:
ft = TEXT("ラスターフォント");
break;
case TRUETYPE_FONTTYPE:
ft = TEXT("TrueTypeフォント");
break;
}
StringCchPrintf(pszDest, cchDest, TEXT("%s %s %s %s"), lpelf->elfFullName, lpelf->elfStyle, lpelf->elfScript, ft);
SendMessage((HWND)lParam, LB_ADDSTRING, NULL, pszDest);
return 1;
}
static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
static HWND hList;
LOGFONT lf;
lf.lfFaceName[0] = 0; // 全てのフォント名
lf.lfCharSet = SHIFTJIS_CHARSET;
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_CREATE:
ShowWindow(hWnd, SW_SHOW);
hList = CreateWindow(
TEXT("LISTBOX"), NULL,
WS_CHILD | WS_VISIBLE | LBS_STANDARD,
0, 0, 700, 300, hWnd, (HMENU)1,
((LPCREATESTRUCT)(lParam))->hInstance, NULL
);
hdc = GetDC(hWnd);
EnumFontFamiliesEx(hdc, &lf, EnumFontFamExProc, (LPARAM)hList, 0);
ReleaseDC(hWnd, hdc);
break;
case WM_LBUTTONDOWN: //マウスの左ボタンが押された
InvalidateRect(hWnd, NULL, TRUE); //クライアント領域を無効化する
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0L;
}
int APIENTRY wWinMain(
_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR ipCmdLine,
_In_ int nCmdShow
) {
WNDCLASSEXW wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = NULL;
wcex.hCursor = NULL;
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = TEXT("TestWindow");
wcex.hIconSm = NULL;
RegisterClassExW(&wcex);
HWND hWnd = CreateWindowEx(0UL, TEXT("TestWindow"), TEXT("日本"), WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
〇実行結果