让程序使用自带的字体2

Posted Redrain

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了让程序使用自带的字体2相关的知识,希望对你有一定的参考价值。

转载请说明原出处,谢谢~~: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


以上是关于让程序使用自带的字体2的主要内容,如果未能解决你的问题,请参考以下文章

在网页中自带字体的方法

STemWin显示汉字 — SD卡外挂XBF字库

windows系统下,在C#程序中自动安装字体

opencv 中自带的模板匹配算法出处

opencv 中自带的模板匹配算法出处

Excel学生成绩分析表,函数计算变色字体,自带科目排名快手套用