让程序使用自带的字体2

简介: 转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/45362655         之前写过一篇博客,说明关于加载自带字体的。

转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/45362655


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


#pragma once
class 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


目录
相关文章
|
6月前
|
存储 安全 BI
硬盘有坏道怎么办?硬盘坏道如何屏蔽?
本文简单介绍一下坏道的类型,然后介绍检测工具、坏道屏蔽方法,感兴趣的用户可以尝试。
|
数据挖掘 项目管理 调度
「软件项目管理」一文详解软件项目质量计划
该文章全面介绍了软件项目质量计划的制定方法,涵盖了质量模型、质量管理过程、质量保证与控制技术,并提出了软件质量改善的具体建议,帮助项目管理人员有效地提升软件产品的质量水平。
「软件项目管理」一文详解软件项目质量计划
|
Java 测试技术 数据库
Java一分钟之-Mockito:模拟对象测试
【6月更文挑战第4天】Mockito是Java单元测试中的模拟框架,用于创建和配置模拟对象以隔离测试代码。核心概念包括:模拟对象、预期行为(定义方法调用响应)、验证(检查方法调用)和捕获参数。常见问题包括过度模拟、忽略未使用的模拟调用、不恰当配置和误用Mockito注解。解决方案包括正确选择模拟对象、验证所有交互、仔细配置模拟行为及在测试类中正确使用Mockito注解。提供的代码示例展示了如何使用Mockito模拟和验证方法调用,以实现独立且准确的测试。学习和避免这些易错点可提升测试效率和代码质量。
590 0
Java一分钟之-Mockito:模拟对象测试
|
存储 安全 Java
Java数组(Arrays)详解
Java 中的数组是一种用于存储固定数量同类型数据的高效数据结构,支持连续内存存储和随机访问。数组可以声明并初始化,通过索引访问和修改元素,获取长度,使用循环遍历,支持多维形式,并可通过 `Arrays` 类的方法进行复制和排序。数组具有固定大小和类型安全的特点,但需注意越界等问题。灵活运用数组能显著提升编程效率。
517 12
|
安全 小程序 Windows
[笔记]攻防工具分享之 CobaltStrike框架 《二》生成后门
[笔记]攻防工具分享之 CobaltStrike框架 《二》生成后门
374 0
|
关系型数据库 MySQL 数据库
MySQL数据库基础第四篇(多表查询与事务)
MySQL数据库基础第四篇(多表查询与事务)
|
运维 Java Nacos
nacos常见问题之配置不生效不加载shared-configs 配置如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
4796 0
|
Linux
linux find命令 不显示 Permission denied
linux find命令 不显示 Permission denied
313 0
|
小程序 前端开发
微信小程序——后台交互
微信小程序——后台交互
195 0
|
开发工具 git Windows
使用git clone 遇见git did not exit cleanly (exit code 128)的个人解决方案
使用git clone 遇见git did not exit cleanly (exit code 128)的个人解决方案
1953 0
使用git clone 遇见git did not exit cleanly (exit code 128)的个人解决方案