各位大虾,小弟按照下面的步骤获取系统自带的字体(遇到的问题见后面描述)
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. 首先定义一个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:第一次插图,不知道成功与否,若有问题小弟还请教下怎么插入图片
赶紧换 VS2008 sp1 吧,
CMFCFontComboBox
什么都不用做,关联个变量就是了。全部搞定!
你试一下吧。别忘了把
logfont.lfCharSet = SHIFTJIS_CHARSET;
改成中文
或
省却值 DEFAULT_CHARSET; 。
http://www.softist.com/programming/fontlist/fontlist.htm-----------------------
2008有了 CMFCFontComboBox ? 真幸福呀。
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是一个列表控件变量
lf.lfOutPrecision = OUT_TT_ONLY_PRECIS;//这句不知道啥意思。初始化时用softist提供的ZeroMemory(&lf, sizeof(LOGFONT))就行了。下面那句我没加。目前疑似正常了。