博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
让程序使用自带的字体2
阅读量:5843 次
发布时间:2019-06-18

本文共 1843 字,大约阅读时间需要 6 分钟。

转载请说明原出处,谢谢~~:

        之前写过一篇博客,说明关于加载自带字体的。,不过后来发现使用AddFontResource函数缺点不少。主要是创建的字体不是自己程序私有的,其他程序也可以使用到。而且函数调用后会在程序目录创建一个.FOT格式的文件。后来再次翻阅MSDN时发现了AddFontMemResourceEx函数,这个函数可以从内存缓冲中加载字体,并且创建的字体是私有的,也不会创建FOT文件。所以又封装了一个简单的类来为程序添加自带的字体。

#pragma onceclass CAddMemFont{public:	CAddMemFont(void);	~CAddMemFont(void);	   /*    * @param filePath:字体文件相对本程序的路径,不需要加前缀\\,(example:Font\\微软雅黑.ttf)    */	bool AddFont(LPCTSTR szfilePath);private:	TCHAR		m_szFilePath[MAX_PATH];	HANDLE		m_hFont;};

#include "sdtafx.h"CAddMemFont::CAddMemFont(void)	: m_hFont( NULL ){	ZeroMemory( m_szFilePath, MAX_PATH );	GetCurrentDirectory(MAX_PATH, m_szFilePath);	_tcscat_s(m_szFilePath, MAX_PATH, _T("\\"));}CAddMemFont::~CAddMemFont(void){	RemoveFontMemResourceEx(m_hFont);}bool CAddMemFont::AddFont(LPCTSTR szfilePath){	_tcscat_s(m_szFilePath, MAX_PATH, szfilePath);	HANDLE hFile = CreateFile( m_szFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);	if (hFile == INVALID_HANDLE_VALUE)	{		return false;	}	DWORD dwFileSize	= GetFileSize(hFile, NULL);	BYTE* lpBuffer		= new BYTE[dwFileSize+1];	DWORD dwReadSize	= 0;	if (!ReadFile( hFile, lpBuffer, dwFileSize, &dwReadSize, NULL))	{		delete[] lpBuffer;		CloseHandle(hFile);		return false;	}	lpBuffer[dwReadSize] = '\0';	DWORD dwFontNumber	= 0;	m_hFont = AddFontMemResourceEx(lpBuffer, dwReadSize, 0, &dwFontNumber);	if ( m_hFont == NULL )	{		delete[] lpBuffer;		CloseHandle(hFile);		return false;	}	return true;}

        使用时,先把字体文件(这里是“DroidSansFallback.ttf")放到自己指定的目录(这里是程序文件夹中的Font文件夹),然后_tWinMain函数中,声明一个CAddMemFont变量。然后调用AddFont方法就可以了(需要注意的就是,应该在窗体创建之前就调用这个方法,因为窗体的创建过程中就会去解析xml并且创建字体对象,如果在窗体创建之后再调用,就已经迟了)

CAddMemFont font;	if (!font.AddFont(_T("Font\\DroidSansFallback.ttf")))	{		MessageBox( NULL, _T("加载内存字体错误"), _T(""), MB_OK );	}

       这时就可以直接在编写xml文件时使用这个字体了,效果如下:

Redrain  QQ:491646717  2015.4.29

你可能感兴趣的文章
【<meta name="description" content=">】作用讲解
查看>>
Kubernetes最佳实践S01E05:如何优雅地终止
查看>>
《TCP IP 详解卷1:协议》阅读笔记 - 第三章
查看>>
12月17日云栖精选夜读 | 用PrettyPrinter,让Python输出更漂亮,你值得拥有
查看>>
第一届PolarDB数据库性能大赛Java选手分享
查看>>
JdbcTemplate带参数的分页查询
查看>>
SpringCloud Alibaba - Ribbon消费Nacos Discovery服务
查看>>
VPO微珀宣布完成千万人民币Pre-A融资,专注电子烟场景化消费市场
查看>>
云盘加密支持选择自定义 KMS 密钥
查看>>
DataWorks:通过业务时间维度来看自定义参数“[ ]”与“{ }”的区别
查看>>
带你开发类似Pokemon Go的AR游戏
查看>>
zabbix中文显示乱码解决
查看>>
python深拷贝与浅拷贝
查看>>
“平行宇宙”要证实?科学家打造出预测多个“未来”的量子计算机
查看>>
好好说说Java中的常量池之Class常量池
查看>>
最全Redis49题详细答案:线程设计+哨兵+复制+事务+集群+持久化等
查看>>
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 8 章 数据类型_8.12. UUID类型
查看>>
Redis 命令行工具有趣的罕见用法
查看>>
猜猜今天是什么日子?
查看>>
sql server 备份与恢复系列四 大容量模式下的备份与还原
查看>>