让程序使用自带的字体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


目录
相关文章
|
存储 安全 BI
硬盘有坏道怎么办?硬盘坏道如何屏蔽?
本文简单介绍一下坏道的类型,然后介绍检测工具、坏道屏蔽方法,感兴趣的用户可以尝试。
|
缓存 监控 Ubuntu
Linux命令slabtop详解
`slabtop`是Linux内存监控工具,展示内核slab缓存的实时状态。它读取`/proc/slabinfo`,显示缓存名、对象数、大小和使用详情。特点包括实时显示、可排序和多选项定制。常用参数有`-d`设置更新间隔,`-s`按特定标准排序。适用于多种Linux发行版,用于识别性能瓶颈和优化内存使用。结合其他工具使用,提升系统性能。
|
C语言
ASCII编码的52个大小写字母
ASCII编码的52个大小写字母
29519 1
|
人工智能 自然语言处理
到底什么是Prompt?
到底什么是Prompt?
2909 0
|
Java 程序员 开发工具
Git Cherry-pick 使用
Git Cherry-pick 使用
|
安全 算法 网络协议
【计算机网络】HTTPS协议原理
【计算机网络】HTTPS协议原理
952 0
|
Java Android开发 C++
我个人实现的C++之get和set方法,使用宏定义
我个人实现的C++之get和set方法,使用宏定义
1243 0
ListView、TreeView和DataGrid。
原文:ListView、TreeView和DataGrid。 1、ListView。 ListView继承自简单的没有特色的ListBox,并使用View属性进行扩展。增加了对基于列显示的支持,并增加了快速切换视图或显示模式的能力,而不需要重新绑定数据以及重新构建列表。
1487 0
|
Serverless 云计算 数据管理
你不知道的那些“XX即服务”
  云计算引发了一系列XX即服务的新模式,从早期的软件即服务(Saas)到现在流行的网络即服务(Naas),各种“XX即服务”的术语也让很多IT工作者觉得一头雾水,本期的信息化内参,带你全面了解各种各样的XX即服务。
2568 0
|
C++ 编译器
c++面试常用知识(sizeof计算类的大小,虚拟继承,重载,隐藏,覆盖)
一. sizeof计算结构体   注:本机机器字长为64位 1.最普通的类和普通的继承 #include using namespace std; class Parent{ public: void fun(){ cout
1489 0

热门文章

最新文章