各位大虾,小弟按照下面的步骤获取系统自带的字体(遇到的问题见后面描述)
1. 首先定义一个Dlg,在其上放了一个ComboBox控件,目的是将系统字体都放到该控件下拉列表中
2. 按照网上的例子,利用EnumFontFamiliesEx和自定义的EnumFontFamProc(GDI中有不知道怎么使用于是就自己定义)函数来获取系统字体,代码如下:EnumFontFamProc函数(其声明处定义其为Static的函数)
int _stdcall CBKColorDlg::EnumFontFamProc(LPENUMLOGFONT   lpelf,LPNEWTEXTMETRIC   lpntm,
 DWORD   nFontType,long   lparam)
{
    CBKColorDlg* pWnd = (CBKColorDlg*)lparam;

    if (nFontType & TRUETYPE_FONTTYPE)
    {
pWnd->m_combolist.AddString(lpelf->elfLogFont.lfFaceName);  //向ComboBox加字体
    }
    //return 1 to continue enumeration
    return 1;
}在Dlg的OnInitDlg()中加入以下代码:
//字体
CClientDC dc(this);
LOGFONT lf;
lf.lfCharSet = DEFAULT_CHARSET;
lstrcpy(lf.lfFaceName, _T(""));
lf.lfOutPrecision = OUT_TT_ONLY_PRECIS;
::EnumFontFamiliesEx((HDC)dc,&lf,(FONTENUMPROC)EnumFontFamProc,(LPARAM)this,0);
this->ReleaseDC(&dc);最终结果为:(将结果图附上)
有些字体重复出现(出现了6,7次),有的出现了一次,有的没有出现小弟请教下代码应该这那么修改才能达到预计的效果,谢谢了PS:第一次插图,不知道成功与否,若有问题小弟还请教下怎么插入图片

解决方案 »

  1.   

    唉,可怜的 lz 啊,还在为这些事折腾,
    赶紧换 VS2008 sp1 吧,
    CMFCFontComboBox
    什么都不用做,关联个变量就是了。全部搞定!
      

  2.   

    我有一个例程,虽然是日语的,代码部分是一样的。
    你试一下吧。别忘了把
    logfont.lfCharSet = SHIFTJIS_CHARSET;
    改成中文

    省却值 DEFAULT_CHARSET; 。
    http://www.softist.com/programming/fontlist/fontlist.htm-----------------------
    2008有了 CMFCFontComboBox ? 真幸福呀。 
      

  3.   

    枚举所有字体   
      LOGFONT   lf;   
      lf.lfCharSet   =   DEFAULT_CHARSET;   //   Initialize   the   LOGFONT   structure   
      strcpy(lf.lfFaceName,"");   
      CClientDC   dc   (this);   
        
      //Enumerate   the   font   families   
      ::EnumFontFamiliesEx((HDC)   dc,&lf,   
      (FONTENUMPROC)   EnumFontFamProc,(LPARAM)   this,0);   
        
      //枚举函数   
      int   CALLBACK   EnumFontFamProc(LPENUMLOGFONT   lpelf,LPNEWTEXTMETRIC   lpntm,DWORD   nFontType,long   lparam)   
      {   
              //   Create   a   pointer   to   the   dialog   window   
              CDay7Dlg*   pWnd   =   (CDay7Dlg*)   lparam;   
              //   add   the   font   name   to   the   list   box   
        
              pWnd   ->m_ctlFontList.AddString(lpelf   ->elfLogFont.lfFaceName);   
        
              //   Return   1   to   continue   font   enumeration   
              return   1;   
      }   
      其中m_ctlFontList是一个列表控件变量
      

  4.   

    没人结贴!!我看了下softist提供的代码,发现主要区别在于LOGFONT的初始化问题上。lstrcpy(lf.lfFaceName, _T(""));//初始化LOGFONT变量lf
    lf.lfOutPrecision = OUT_TT_ONLY_PRECIS;//这句不知道啥意思。初始化时用softist提供的ZeroMemory(&lf, sizeof(LOGFONT))就行了。下面那句我没加。目前疑似正常了。