[kaze's test] プログラミングメモ →目次

使用可能なフォント名を列挙する方法(VC++)

EnumFontFamiliesEx()API関数で、指定された条件に適合するフォントを列挙できます。EnumFontFamExProc()関数は、アプリケーション定義のコールバック関数で、フォントの種類毎に処理をします。

例: 画面上に表示できるShiftJISフォント名を列挙して、コンボ ボックスのリストに保存します。「オーナー描画」によりコンボ ボックスのリストをそれぞれの書体で描画します。



1.ダイアログベースに、コンボ ボックスを貼り付けます。「オーナー描画」のプロパティーをセットします。CComboBoxからCcmbFontクラスを派生します。

class CFontTestDlg : public CDialog
{
    ... ...
//CComboBoxから派生する「スオーナー描画」つきのクラスで、オブジェクトを宣言する
    CcmbFont m_cmbFont;
    ... ...
};

2.コールバック関数を実装します。

int CALLBACK EnumFontFamExProc(ENUMLOGFONTEX *lpelfe, NEWTEXTMETRICEX *lpntme, int FontType, LPARAM lParam)
{
//CFontTestDlgのm_cmbFont(コンボ ボックス)のポインターを代入する
    CcmbFont* pCmbFont = (CcmbFont*)lParam;
//列挙されたフォント名をコンボ ボックスのリストに追加する
    pCmbFont->AddString((TCHAR*)lpelfe->elfFullName);
    return TRUE;
}

3.OnInitDialog()で、フォントを列挙するための処理を実装します。

BOOL CFontTestDlg::OnInitDialog()
{
    ... ...
    CClientDC dc(this);
    LOGFONT logfont; 
    ZeroMemory(&logfont, sizeof(LOGFONT)); 
//条件設定:ShiftJISの文字セットを指定する
    logfont.lfCharSet = SHIFTJIS_CHARSET;
//コールバック関数の引数lParamにm_cmbFontのポインターを代入する
    ::EnumFontFamiliesEx(dc.m_hDC, &logfont, (FONTENUMPROC)EnumFontFamExProc, (long)&m_cmbFont, 0); 
    ... ...
}

4.CcmbFontクラスの「スオーナー描画」関数DrawItem()をオーバライドして実装します。

void CcmbFont::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
//フォント名をコンボ ボックスのリストから取得する
    CString rString;
    if (lpDrawItemStruct->itemID == -1)
        return;
    GetLBText(lpDrawItemStruct->itemID, rString );
    CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);

//取得したフォント名でフォントをセットする。
    CFont font;
    LOGFONT logfont;
    memset(&logfont, 0, sizeof(logfont));
    logfont.lfHeight = 18;
    logfont.lfWidth = 0;
    logfont.lfWeight = 400;
    logfont.lfCharSet = SHIFTJIS_CHARSET;
    pDC->SelectObject(&font);
    strcpy(logfont.lfFaceName, (LPCTSTR)rString);
    font.CreateFontIndirect(&logfont);
    pDC->SelectObject(&font);

//取得したフォント名を文字列として表示する
    pDC->DrawText(rString, &lpDrawItemStruct->rcItem, DT_SINGLELINE | DT_VCENTER);
}