1.字体简介
(1)windows的字体文件所在目录是"C:\Windows\Fonts",字体后缀目前包括ttf、ttc、Fon几种类型
(2)对同一种字体而言,在不同的系统上文件类型可能不一样,如微软雅黑的字体文件有msyh.ttf,也有msyh.ttc类型
(3)xp系统默认的字体类型是宋体,默认没有微软雅黑字体的,而从winodws vista(win7到win10)开始,系统的默认字体变为微软雅黑
(4)同一种字体,在不同语言的操作系统下,名称可能不一样,如微软雅黑,中文名称就是“微软雅黑”,但在英文操作系统下,名称变成了"Microsoft YaHei"
注意:这里的中英文操作系统是指安装时候的操作系统,不是语言包
2.如何判断字体是否安装(以微软雅黑为例)
法一:判断字体文件夹有没有字体文件
//判断微软雅黑是否安装
TCHAR achfilePath[MAX_PATH];
::SHGetSpecialFolderPath (NULL, achfilePath, CSIDL_FONTS , FALSE);
CString strDstName[3];
strDstName[0].Format(_T("%s\\msyh.ttf"),achfilePath);
strDstName[1].Format(_T("%s\\msyh.ttc"),achfilePath);
strDstName[2].Format(_T("%s\\msyh.Fon"),achfilePath);
if ( PathFileExists(strDstName[0]) != TRUE
&& PathFileExists(strDstName[1]) != TRUE
&& PathFileExists(strDstName[2]) != TRUE)
{
....//未安装
}
else
{
....//安装
}
缺点:以后微软对系统字体文件增加时,会有问题
法二:利用EnumFontFamilies
建立MFC工程,类名为CFunApp,头文件中添加成员变量m_bInstallYHFont
在cpp文件中添加下面内容:
char g_achDefaultFont[MAX_PATH] = ="微软雅黑";;
int CALLBACK EnumFontFamProc (ENUMLOGFONT* lpelf, NEWTEXTMETRIC* lpntm, int nFontType, LPARAM lParam)
{
CtouchApp* pApp = (CtouchApp*) lParam;
if ( 0 == lstrcmp(lpelf->elfLogFont.lfFaceName, _T("微软雅黑"))
|| 0 == lstrcmp(lpelf->elfLogFont.lfFaceName, _T("Microsoft YaHei")))
{
pApp->m_bInstallYHFont = true;
}
return 1;
}
BOOL CFunApp::InitInstance()
{
HDC hdc=::GetDC(NULL);
int nSt = ::EnumFontFamilies (hdc, NULL, (FONTENUMPROC) EnumFontFamProc,
(LPARAM)this);
//验证过上面回调函数执行完才会继续从这里运行
if ( !m_bInstallYHFont )
{
....;//未安装
}
else//已安装
{
....
}
}
注意:GetSystemDefaultLangID获取的是安装时候的系统的语言,对于那种是中文操作系统,安装了英文语言包的情况,获取到的值不变
3.如何让自己的应用程序保证在未安装使用的字体的情况下显示正常?
法一:判断字体是否安装,若未安装,则使用一种所有系统都有的字体,若已安装,判断下所使用的字体中英文系统情况下是否字体名一样
BOOL CFunApp::InitInstance()
{
HDC hdc=::GetDC(NULL);
int nSt = ::EnumFontFamilies (hdc, NULL, (FONTENUMPROC) EnumFontFamProc,
(LPARAM)this);
if ( !m_bInstallYHFont )
{
sprintf(g_achDefaultFont, "Arial");//未安装选取一种所有操作系统都有的字体,如宋体,Arial
}
else//已安装
{
LANGID langID = GetSystemDefaultLangID();
if ( langID != 0x0804 )//非中文系统
{
sprintf(g_achDefaultFont, "Microsoft YaHei");
}
}
}
法二:使用自定义的字体,嵌入到应用程序资源中,或者安装包中包含字体
缺点:exe很大或者字体文件很大导致安装包很大
(此种方法不好,若想实现请自行百度)