ホーム ATL/WTL
フォント
ドキュメント種別 ATL/WTL に関する文書
最終更新日 2005/02/20
PR
 WTLではGDIオブジェクトのフォントをCFontTというテンプレートクラスでカプセル化しています。 テンプレート引数はbool値で、trueの場合はデストラクタでDeleteObject()を呼び出し、 falseの場合は呼び出しません。atlgdi.hヘッダではtypedefによって次のように宣言されています。

// atlgdi.h内
typedef CFontT<false>  CFontHandle;
typedef CFontT<true>   CFont;
			

 WTLのCFontクラスは、MFCの同名のクラスとほぼ同じメンバ関数を用意しています。 以下に示すのは、CFontクラスを使用してクライアント領域の中央に"Arial Black"フォントの文字列を描画する例です。


// WM_PAINTメッセージハンドラ
void OnPaint(HDC /*hDC*/){
    CPaintDC dc(m_hWnd);

    // サイズ20ポイントの"Arial Black"フォントを作成し、選択
    CFont font;
    font.CreatePointFont(200, _T("Arial Black"));
    HFONT hOldFont = dc.SelectFont(font);

    // テキスト色を赤に設定
    dc.SetTextColor(RGB(255, 0, 0));

    // クライアント矩形を取得し、文字列を描画
    CRect rect;
    GetClientRect(rect);
    dc.DrawText(_T("Hello, ATL/WTL"), -1,
        rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

    // 元のフォントを選択
    dc.SelectFont(hOldFont);
}
			

 この例では、まずフォントオブジェクトを作成し、 それをSelectFont()で現在のフォントとして選択しています。 なお、CreatePointFont()の第1引数は1/10ポイント単位のフォントサイズを受け取るので、 描画したいポイントサイズを10倍して渡します。 SelectFont()は引数にHFONT型の変数を受け取りますが、 CFontTクラスはHFONT変換演算子を持っているのでそのまま渡すことができます。 SelectFont()は以前のフォントハンドルを返すので、 これをhOldFontという変数に保存しておきます。

次に、文字列を描画します。フォント名が Arial Black で、 フォントサイズが20ポイントの赤い文字列が描画されます。

最後に、先ほど保存しておいた元のフォントハンドルに戻すため、 再度SelectFont()を呼び出して元のフォントハンドルを選択します。

 ところで、WTLはストックフォントもサポートしています。 以下に示すのは、ストックフォントによってシステムフォントで文字列を描画する例です。

// WM_PAINTメッセージハンドラ
void OnPaint(HDC /*hDC*/){
    CPaintDC dc(m_hWnd);

    // ストックフォントを選択
    HFONT hOldFont = dc.SelectStockFont(SYSTEM_FONT);

    // テキスト色を赤に設定
    dc.SetTextColor(RGB(255, 0, 0));

    // クライアント矩形を取得し、文字列を描画
    CRect rect;
    GetClientRect(rect);
    dc.DrawText(_T("Hello, ATL/WTL"), -1,
        rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

    // 元のフォントを選択
    dc.SelectFont(hOldFont);
}
			

また、atlmisc.hヘッダに定義されているAtlGetStockFont()というグローバル関数を使えば、 ストックフォントのハンドルを取得することができます。

// ストックフォントのハンドルを取得
HFONT hStockFont = AtlGetStockFont(SYSTEM_FONT);
			

さらに、atlapp.hヘッダに定義されているAtlGetDefaultGuiFont()というグローバル関数を使えば、 ストックフォントの中でもデフォルトGUIフォントのハンドルを取得することができます。

// デフォルトGUIフォントのハンドルを取得
HFONT hGUIFont = AtlGetDefaultGuiFont();

// AtlGetStockFont()を使用して上と同じフォントのハンドルを取得
HFONT hStockFont = AtlGetStockFont(DEFAULT_GUI_FONT);
			

デフォルトGUIフォントとは、メニューやダイアログボックスに使われるデフォルトのフォントです。

CLogFont
 WTL7.5.5002ではCLogFontクラスが追加されました。 CLogFontクラスはLOGFONT構造体から派生しており、 LOGFONT構造体を操作するための様々なメンバ関数を用意しています。

以下に示すのは、CLogFontクラスを使用してタイトルバーと同じフォントで文字列を描画する例です。

// WM_PAINTメッセージハンドラ
void OnPaint(HDC /*hDC*/){
    CPaintDC dc(m_hWnd);

    // サイズ20ポイントでタイトルバーと同じフォントを作成し、選択
    CLogFont lf;
    lf.SetCaptionFont();
    lf.SetHeight(20, dc);

    CFont font;
    font.CreateFontIndirect(&lf);
    HFONT hOldFont = dc.SelectFont(font);

    // テキスト色を赤に設定
    dc.SetTextColor(RGB(255, 0, 0));

    // クライアント矩形を取得し、文字列を描画
    CRect rect;
    GetClientRect(rect);
    dc.DrawText(_T("Hello, ATL/WTL"), -1,
        rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

    // 元のフォントを選択
    dc.SelectFont(hOldFont);
}