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