|
SOFTIST
编程方法筆記 →目录
列举可以使用的字模名(VC++)
调用EnumFontFamiliesEx()AP函数可以把满足指定条件的字模名都列举出来。
EnumFontFamExProc()函数是列举处理时使用的一个回调函数。需要自己填写,下面的例子中,只是简单的把遇到的字模名追加到ComboBox的列表里。
由于笔者的OS环境是日文,列举一下日语字模。日语Windows使用ShiftJIS代码。我们把字模名列举出来,用ComboBox表示到窗口画面上。为了体现字模的书体个性,用自描画的方式使用ComboBox。

1.在资源编辑器,为对话框贴一个ComboBox,并且设其属性为「自描画」。从CComboBox生成派生类CcmbFont,并以此类型定义一个变量m_cmbFont插入到CDialog的派生类CFontTestDlg中。
class CFontTestDlg : public CDialog
{
... ...
CcmbFont m_cmbFont;
... ...
};
2.填写回调函数。
int CALLBACK EnumFontFamExProc(ENUMLOGFONTEX
*lpelfe, NEWTEXTMETRICEX *lpntme, int FontType, LPARAM lParam)
{
//lParam的内容是m_cmbFont的地址
CcmbFont* pCmbFont = (CcmbFont*)lParam;
//取出字模名追加ComboBox的列表里
pCmbFont->AddString((TCHAR*)lpelfe->elfFullName);
return TRUE;
}
3.在CFontTestDlg的OnInitDialog()中,调用EnumFontFamiliesEx()函数。
BOOL CFontTestDlg::OnInitDialog()
{
... ...
CClientDC dc(this);
LOGFONT logfont;
ZeroMemory(&logfont, sizeof(LOGFONT));
//设检索条件:ShiftJIS的文字
logfont.lfCharSet = SHIFTJIS_CHARSET;
//把m_cmbFont的地址代入到回调函数的参数的lParam
::EnumFontFamiliesEx(dc.m_hDC, &logfont,
(FONTENUMPROC)EnumFontFamExProc,
(long)&m_cmbFont, 0);
... ...
}
中文汉语将条件设成 GB2312_CHARSET
4.重载和填写CcmbFont类的「自描画」函数DrawItem()。
void CcmbFont::DrawItem(LPDRAWITEMSTRUCT
lpDrawItemStruct)
{
//从ComboBox取出当前行的字符串,即字模名
CString rString;
if (lpDrawItemStruct->itemID == -1)
return;
GetLBText(lpDrawItemStruct->itemID, rString );
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
//为DC设定字体字模
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);
}
|