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 にする必要があります。

 

〇プログラム例

リストボックスに日本語のフォント名を表示します。

 

  1. #include <windows.h>
  2. #include <strsafe.h>
  3.  
  4.  
  5. int CALLBACK EnumFontFamExProc(const ENUMLOGFONTEX* lpelf, const TEXTMETRIC* lpntme, DWORD FontType, LPARAM lParam) {
  6.     TCHAR pszDest[100];
  7.     size_t cchDest = 100;
  8.     LPCWSTR ft = TEXT("");
  9.  
  10.     switch (FontType) {
  11.     case DEVICE_FONTTYPE:
  12.         ft = TEXT("デバイスフォント");
  13.         break;
  14.     case RASTER_FONTTYPE:
  15.         ft = TEXT("ラスターフォント");
  16.         break;
  17.     case TRUETYPE_FONTTYPE:
  18.         ft = TEXT("TrueTypeフォント");
  19.         break;
  20.     }
  21.  
  22.     StringCchPrintf(pszDest, cchDest, TEXT("%s %s %s %s"), lpelf->elfFullName, lpelf->elfStyle, lpelf->elfScript, ft);
  23.     SendMessage((HWND)lParam, LB_ADDSTRING, NULL, pszDest);
  24.  
  25.     return 1;
  26. }
  27.  
  28. static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  29. {
  30.     HDC hdc;
  31.     PAINTSTRUCT ps;
  32.     static HWND hList;
  33.  
  34.     LOGFONT lf;
  35.     lf.lfFaceName[0] = 0; // 全てのフォント名
  36.     lf.lfCharSet = SHIFTJIS_CHARSET;
  37.  
  38.     switch (uMsg)
  39.     {
  40.     case WM_DESTROY:
  41.         PostQuitMessage(0);
  42.         break;
  43.  
  44.     case WM_CREATE:
  45.         ShowWindow(hWnd, SW_SHOW);
  46.         hList = CreateWindow(
  47.             TEXT("LISTBOX"), NULL,
  48.             WS_CHILD | WS_VISIBLE | LBS_STANDARD,
  49.             0, 0, 700, 300, hWnd, (HMENU)1,
  50.             ((LPCREATESTRUCT)(lParam))->hInstance, NULL
  51.         );
  52.         hdc = GetDC(hWnd);
  53.         EnumFontFamiliesEx(hdc, &lf, EnumFontFamExProc, (LPARAM)hList, 0);
  54.         ReleaseDC(hWnd, hdc);
  55.         break;
  56.  
  57.     case WM_LBUTTONDOWN: //マウスの左ボタンが押された
  58.         InvalidateRect(hWnd, NULL, TRUE); //クライアント領域を無効化する
  59.         break;
  60.  
  61.     case WM_PAINT:
  62.         hdc = BeginPaint(hWnd, &ps);
  63.         EndPaint(hWnd, &ps);
  64.         break;
  65.  
  66.     default:
  67.         return DefWindowProc(hWnd, uMsg, wParam, lParam);
  68.     }
  69.     return 0L;
  70. }
  71.  
  72. int APIENTRY wWinMain(
  73.     _In_ HINSTANCE hInstance,
  74.     _In_opt_ HINSTANCE hPrevInstance,
  75.     _In_ LPWSTR ipCmdLine,
  76.     _In_ int nCmdShow
  77. ) {
  78.  
  79.     WNDCLASSEXW wcex;
  80.  
  81.     wcex.cbSize = sizeof(WNDCLASSEX);
  82.  
  83.     wcex.style = CS_HREDRAW | CS_VREDRAW;
  84.     wcex.lpfnWndProc = WndProc;
  85.     wcex.cbClsExtra = 0;
  86.     wcex.cbWndExtra = 0;
  87.     wcex.hInstance = hInstance;
  88.     wcex.hIcon = NULL;
  89.     wcex.hCursor = NULL;
  90.     wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  91.     wcex.lpszMenuName = NULL;
  92.     wcex.lpszClassName = TEXT("TestWindow");
  93.     wcex.hIconSm = NULL;
  94.  
  95.     RegisterClassExW(&wcex);
  96.  
  97.     HWND hWnd = CreateWindowEx(0UL, TEXT("TestWindow"), TEXT("日本"), WS_OVERLAPPEDWINDOW,
  98.         CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
  99.  
  100.     if (!hWnd)
  101.     {
  102.         return FALSE;
  103.     }
  104.  
  105.     MSG msg;
  106.  
  107.     while (GetMessage(&msg, NULL, 0, 0))
  108.     {
  109.         DispatchMessage(&msg);
  110.     }
  111.  
  112.     return (int)msg.wParam;
  113. }

 

〇実行結果