MFC windows字体简介

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很大或者字体文件很大导致安装包很大

(此种方法不好,若想实现请自行百度)



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值