1 设置组合框控件变量
DDX_Control(pDX, IDC_COMBO1, m_FontList);
// 当前字体名称 CString m_selFont;
2 声明CALLBACK函数
注意:此函数为全局函数,而不是类函数
BOOL CALLBACK AFX_EXPORT EnumFamScreenCallBackEx(ENUMLOGFONTEX* pelf, NEWTEXTMETRICEX* lpntm, int FontType, LPVOID pThis);/*回调函数,枚举系统已经安装的字体*/
3 定义CALLBACK函数
BOOL CALLBACK EnumFamScreenCallBackEx(ENUMLOGFONTEX* pelf, NEWTEXTMETRICEX* lpntm, int FontType, LPVOID pThis) { if (FontType&RASTER_FONTTYPE) { return TRUE; } CString str; if (FontType&TRUETYPE_FONTTYPE) { str=((pelf)->elfLogFont.lfFaceName); } int i=((CSizeDlg *)pThis)->m_FontList.AddString(str); return TRUE; }
4 调用
BOOL CSizeDlg::EnumerateFonts() { HDC hDC; hDC=::GetWindowDC(NULL); LOGFONT lf; memset(&lf,0,sizeof(LOGFONT)); lf.lfCharSet=GB2312_CHARSET; if (!::EnumFontFamiliesEx( hDC, &lf, (FONTENUMPROC)EnumFamScreenCallBackEx, (LPARAM)this, (DWORD) 0 )) { return FALSE; } ::ReleaseDC(NULL,hDC); CString strCurrentFont; CString strPreFont=L""; int num=m_FontList.GetCount(); // 删除重复项 for (int i=num;i>0;i--) { m_FontList.GetLBText((i-1),strCurrentFont); if (strCurrentFont==strPreFont) { m_FontList.DeleteString(i-1); } strPreFont=strCurrentFont; } // 删除@字体 循环次序 为 从高到低 因为删除某个元素后, 各个位置可能改变 num=m_FontList.GetCount(); for (int i=num-1;i>=0;i--) { m_FontList.GetLBText(i,strCurrentFont); strCurrentFont=strCurrentFont.Left(1); if (strCurrentFont==_T("@")) { m_FontList.DeleteString(i); } } if (!m_selFont.IsEmpty()) { CString temp; for (int i=0;i<m_FontList.GetCount();i++) { m_FontList.GetLBText(i,temp); if (temp.Compare(m_selFont)==0) { m_FontList.SetCurSel(i); break; } } } return TRUE; }
BOOL CSizeDlg::OnInitDialog() { CDialog::OnInitDialog(); EnumerateFonts(); UpdateData(FALSE); return TRUE; }
5 记录当前字体名称
//SEL 改变时 触发的消息 ON_CBN_SELCHANGE(IDC_COMBO1, &CSizeDlg::OnCbnSelchangeCombo1)
// SEL 改变时,记录当前字体名称 void CSizeDlg::OnCbnSelchangeCombo1() { // TODO: 在此添加控件通知处理程序代码 int i=m_FontList.GetCurSel(); m_FontList.GetLBText(i,m_selFont); }