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