让程序使用自带的字体文件

简介: 转载请说明原出处,谢谢~·http://blog.csdn.net/zhuhongshu/article/details/39396223         我笔记本使用的是win7系统,开发的duilib程序一直都使用微软雅黑字体,昨天在xp系统下测试时发现由于xp下没有微软雅黑字体而导致duilib使用了默认的宋体字,瞬间感觉界面不协调了。

转载请说明原出处,谢谢~·http://blog.csdn.net/zhuhongshu/article/details/39396223


        我笔记本使用的是win7系统,开发的duilib程序一直都使用微软雅黑字体,昨天在xp系统下测试时发现由于xp下没有微软雅黑字体而导致duilib使用了默认的宋体字,瞬间感觉界面不协调了。解决这个问题的方法就是让程序自带自己使用的字体,并且在运行时加载这个字体。以前从来没关心过这个问题。


        比较简单的方法就是在程序运行时把字体文件拷贝到系统的Fonts目录下,让系统自动安装这个字体,但是这样就会修改系统的文件,这可能并不是用户需要的东西。翻了翻MSDN得知了AddFontResource和CreateScalableFontResource这两个API,使用他们可以让程序加载任意路径的字体而不必拷贝到系统路径。于是写了一个AddFont类来加载一个字体,代码如下:


#pragma once

#ifdef UNICODE
typedef wstring tstring;
#else
typedef string	tstring;
#endif

class CAddFont
{
public:
	CAddFont(void);
	~CAddFont(void);	
       /*
        * @param filePath:字体文件相对本程序的路径,不需要加前缀\\,和后缀名
	* @param fontName:字体的名称,如宋体,微软雅黑
        */
	bool AddFont(LPCTSTR szfilePath, LPCTSTR szFontName);

	LPCTSTR GetFontName() const;
private:
	tstring	 m_strFilePath;
	tstring	 m_strFontName;
};

#include "duilib.h"
// duilib.h中已经包含如下头文件
// #include "Windows.h"
// #include "string"
// #include "tchar.h"
// using namespace std;
#include "AddFont.h"


CAddFont::CAddFont(void)
{
	TCHAR szCurrentPath[MAX_PATH] = {0};
	GetCurrentDirectory(MAX_PATH, szCurrentPath);
	m_strFilePath = szCurrentPath;
	m_strFilePath += _T("\\");
}


CAddFont::~CAddFont(void)
{
	wstring strFont = m_strFilePath;
	wstring strFontPath = m_strFilePath;
	strFont += _T(".FOT");
	strFontPath +=  _T(".TTF");

	RemoveFontResource(strFontPath.c_str());
	DeleteFile(strFont.c_str());
}

bool CAddFont::AddFont(LPCTSTR szfilePath, LPCTSTR szFontName)
{
	m_strFilePath += szfilePath;

	wstring strFont = m_strFilePath;
	wstring strFontPath = m_strFilePath;
	strFont += _T(".FOT");
	strFontPath +=  _T(".TTF");

	BOOL bResult = CreateScalableFontResource(0,  strFont.c_str(),  strFontPath.c_str(),  NULL);  
	if (bResult == FALSE)
	{
		DUI__Trace(_T("错误码为:%d"), GetLastError()); //这里使用了duilib自带的调试函数
		::MessageBox(NULL, _T("失败"), _T("提示"), 0);  //实际使用时建议注释此行代码
		return false;
	}

	int nResult = AddFontResource(strFontPath.c_str());
	if (nResult == 0)
	{
		::MessageBox(NULL, _T("失败"), _T("提示2"), 0);  //实际使用时建议注释此行代码
		return false;
	}

	::SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0);
	m_strFontName = szFontName;

	return true;
}

LPCTSTR CAddFont::GetFontName() const
{
	return m_strFontName.c_str();
}

 

      使用起来很简单,声明一个CAddFont变量。然后调用AddFont方法就可以了(需要注意的就是,应该在窗体创建之前就调用这个方法,因为窗体的创建过程中就会去解析xml并且创建字体对象,如果在窗体创建之后再调用,就已经迟了)

    CAddFont		addFont;

   

    同时把”华文新魏“字体文件“STXINWEI.ttf"放到了Font目录里,然后在_tWinMain里加入这行代码就可以了。





    addFont.AddFont(_T("Font\\STXINWEI"), _T("华文新魏"));

       这时就可以直接在编写xml文件时使用这个字体了,效果如下:




总结:

       我这里只是简单随手的封装了一个CAddFont类来做可行性测试,实际这个类的代码写的并不好,读者可以封装一个更好的,支持添加并管理多个字体。实际还有两个更好的API叫AddFontResourceEx和AddFontMemResourceEx,以后有机会再写。如果代码有错误,请联系我


Redrain  QQ:491646717  2014.9.19


目录
相关文章
|
前端开发 API C#
C#使用外部字体、嵌入字体到程序资源中(Winform)及字体的版权问题
应用程序能够使用一个好的字体,是用户界面很重要的一部分,但是很多字体如果系统没有安装,则需要额外引入,这就涉及到极其重要的字体版权问题,及额外字体的使用和安装。最好的方式应该是将字体嵌入到程序中...
3704 1
C#使用外部字体、嵌入字体到程序资源中(Winform)及字体的版权问题
|
存储 PHP 索引
PHPimagettftext字体文件ttc的使用方法
在PHP编程开发中,使用字体文件ttc来渲染文本是一项非常实用的技术。ttc文件是TrueType字体集合文件的缩写,它可以包含多个TrueType字体,因此在使用时需要进行一些特殊处理。下面,我们将为大家介绍PHPimagettftext字体文件ttc的使用方法,希望能够对大家有所帮助。
195 0
Pycharm的相关配置:改字体样式和大小、更改图片背景、更改控制台输出的字体颜色
Pycharm的相关配置:改字体样式和大小、更改图片背景、更改控制台输出的字体颜色
Pycharm的相关配置:改字体样式和大小、更改图片背景、更改控制台输出的字体颜色
|
iOS开发
(转载)教你如何在iOS项目中设置各种字体
原文地址:http://www.cnblogs.com/jijiYY/p/4736967.html 在iOS开发中设置字体的方法有很多种,下面为大家介绍比较常用的三种方法 1.
1458 0
|
XML 数据格式
关于字体编码的一些知识,并带大家制作一套字体。(上)
关于字体编码的一些知识,并带大家制作一套字体。
关于字体编码的一些知识,并带大家制作一套字体。(上)
PyQt5 技术篇-调用字体对话框(QFontDialog)获取字体,控件设置字体。
PyQt5 技术篇-调用字体对话框(QFontDialog)获取字体,控件设置字体。
344 0
PyQt5 技术篇-调用字体对话框(QFontDialog)获取字体,控件设置字体。
|
Windows Python
windows下的PyCharm设置注释字体的斜体
操作截图如下:File --> Settings --> Editor --> Color Scheme --> Language Defaults --> Comments  我的GitHub地址:https://github.
3443 0