Windowsのアイコンのフォントを取得

Windowsの設定では、アイコンのフォントを変えることができます。 このフォントを取得し、ダイアログボックスのフォントとして利用します。
Windows XPの場合、アイコンのデフォルトのフォントは、「MS UI Gothic」ですが、 Windows Vista以降の場合は、「メイリオ」になります。

左下図が、アイコンのフォントを「メイリオ」にした場合です。
右下図が、Windows XPのデフォルトです。

アイコンのフォント1 アイコンのフォント2

余談ですが、Visual C++ 2008をインストールすれば、「メイリオ」がインストールされます。

テキストの表示 - インコのWindowsSDK で作成したソースをもとに作成します。

流れ

1.LOGFONT構造体を定義。

2.SystemParametersInfo() SPI_GETICONTITLELOGFONTメッセージで、アイコンのフォントを取得
SystemParametersInfo()は、Windows環境のパラメータを取得または設定する関数です。

SystemParametersInfo( SPI_GETICONTITLELOGFONT,
  sizeof(LOGFONT),  // LOGFONT構造体のサイズ
  &logfont,         // LOGFONT構造体のアドレス
  0);               // 0固定

WM_INITDIALOG

リストボックス - インコのWindowsSDK でも説明しましたが、WM_INITDIALOGは、ダイアログが作成されたときに一度だけ実行されます。

3.CreateFont()で、論理フォントを作成。 もしくは、CreateFontIndirect()で、直接フォントハンドルにセット

CreateFont()は、LOGFONT構造体と同じ引数をもちます。

CreateFontIndirect(
    LOGFONT logfont    // LOGFONT構造体のアドレス
);

4.WM_SETFONTメッセージをセットし、フォントを変更する。

lResult = SendMessage(
    (HWND) hWndControl, // プログレスバーのハンドル
    (UINT) WM_SETFONT,
    (WPARAM) hFont,     // フォントのハンドル
    (LPARAM) fRedraw    // 再描画
);

●hFont : フォントのハンドルを指定。
0 (NULL) を指定すると、デフォルトのシステムフォント

●fRedraw : 1(TRUE)で、直ちに再描画

ソースコードの入力

ソースコードは下記のように入れてください。

test.cpp
#include <windows.h>
#include "resource.h"

// このコード モジュールに含まれる関数の宣言を転送します:
BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
          PSTR lpCmdLine, int nCmdShow )
{
    DialogBox(hInstance, TEXT("DIALOG_BOX"), NULL, DialogProc);
    return 0;
}

BOOL CALLBACK DialogProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    HFONT hFont;      // フォントハンドル
    LOGFONT logfont;  // LOGFONT 構造体
    // アイコンのフォントを取得
    SystemParametersInfo( SPI_GETICONTITLELOGFONT,
      sizeof(LOGFONT), &logfont, 0);
    switch (msg)
    {
        case WM_INITDIALOG:
            hFont = CreateFont(18, // 文字セルまたは文字の高さ
              0,                   // 平均文字幅 0:自動
              0,                   // 文字送りの方向とX軸との角度
              0,                   // ベースラインとX軸との角度
              FW_NORMAL,           // フォントの太さ
              FALSE,               // イタリック体指定
              FALSE,               // 下線付き指定
              FALSE,               // 打ち消し線付き指定
              SHIFTJIS_CHARSET,    // キャラクタセット
              OUT_DEFAULT_PRECIS,  // 出力精度
              CLIP_DEFAULT_PRECIS, // クリッピングの精度
              DEFAULT_QUALITY,     // 出力品質
              (DEFAULT_PITCH | FF_DONTCARE),  // ピッチとファミリ
              logfont.lfFaceName); // フォント名
            // hFont = CreateFontIndirect(&logfont);
            // フォントの装飾(サイズ等)も、アイコンから取得する場合、上記に差し替え
            SendMessage(GetDlgItem(hWnd, IDC_STATIC1), WM_SETFONT,
              (WPARAM) hFont, true);
            break;
        case WM_CLOSE:
            EndDialog(hWnd, IDOK);
            break;
    }
    return FALSE;
}

resource.h

#define IDC_STATIC1 1
#ifndef IDC_STATIC
#define IDC_STATIC -1
#endif

Reseditで作成した場合は、これとは異なるソースコードになります。

test.rc
#include <windows.h>
#include "resource.h"

/////////////////////////////////////////////////////////////////////////////
//
// ダイアログ
//

DIALOG_BOX DIALOG 0, 0, 170, 62
// FONT 9, "MS UI Gothic" // コメントアウト
CAPTION "ダイアログ"
BEGIN
    LTEXT           "Copyright (C) 2008",IDC_STATIC1,42,26,114,8
END

Reseditで作成した場合は、これとは異なるソースコードになります。