让程序使用自带的字体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的主要内容,如果未能解决你的问题,请参考以下文章