[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);
}
|