让程序使用自带的字体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;
- };
#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;
- }
#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 );
- }
CAddMemFont font;
if (!font.AddFont(_T("Font\\DroidSansFallback.ttf")))
{
MessageBox( NULL, _T("加载内存字体错误"), _T(""), MB_OK );
}
这时就可以直接在编写xml文件时使用这个字体了,效果如下:
Redrain QQ:491646717 2015.4.29
</div>
转载请说明原出处,谢谢~~: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;
- };
#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;
- }
#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 );
- }
CAddMemFont font;
if (!font.AddFont(_T("Font\\DroidSansFallback.ttf")))
{
MessageBox( NULL, _T("加载内存字体错误"), _T(""), MB_OK );
}
这时就可以直接在编写xml文件时使用这个字体了,效果如下:
Redrain QQ:491646717 2015.4.29
</div>
上一篇: 在WPF中使用字体图标
下一篇: WPF使用成熟的命令系统
推荐阅读
-
让程序使用自带的字体2
-
Yii2使用自带的UploadedFile实现的文件上传_php实例
-
ASP.NET Core Web 应用程序系列(三)- 在ASP.NET Core中使用Autofac替换自带DI进行构造函数和属性的批量依赖注入(MVC当中应用)
-
使用JDK自带的VisualVM进行Java程序的性能分析 JDKVisualVM性能分析
-
微信发布的小程序是什么?2张图让你看明白
-
做一个不复制粘贴的程序员[1]: 使用模板方法模式(2)- 对象更新比较器实例
-
Yii2使用自带的UploadedFile实现的文件上传_php实例
-
php实现的程序员使用的web简易采集器V2版
-
Yii2使用自带的UploadedFile实现的文件上传,yii2uploadedfile
-
windows自带的truetype造字程序怎么使用?