慢羊羊的空间

无为,无我,无欲,居下,清虚,自然

在 EasyX 中使用外部字体文件设置字体样式 铜牌收录

在 EasyX 输出字体的时候,要求字体在当前环境中可用,否则就无法看到字体的效果。使用系统中默认存在的字体比较简单,可以直接使用。但是如果字体是自己精心挑选的,系统中不存在,将程序发给别人以后,要求别人安装字体才能启动程序看到效果,就不太合适了。本文详细讲述在不安装字体的前提下如何通过字体文件设置字体样式。

加载外部字体文件

步骤:提前下载好字体文件,将该字体文件临时加载,然后就可以使用 settextstyle 设置字体样式。使用完毕后需要释放临时字体资源。

其中需要使用两个 Windows API 函数:AddFontResourceEx 和 RemoveFontResourceEx。

在使用字体前,需要使用 AddFontResourceEx 临时加载字体文件。不再需要使用该字体时,通过 RemoveFontResourceEx 可以释放临时字体资源。字体文件可以使用绝对路径,也可以使用相对路径。

程序很简单,参考以下示例:

/////////////////////////////////////////////////////////
// 程序名称:加载临时字体文件
// 编译环境:Visual C++ 2010,EasyX_20220610,Unicode 字符集
// 作  者:慢羊羊@codebus
// 发布日期:2022-7-20
//
#include <graphics.h>
#include <conio.h>

int main()
{
	initgraph(640, 480); 	// 初始化图形窗口


	// 临时加载字体资源(可以使用相对路径或绝对路径)
	AddFontResourceEx(L"res\\slideyouran-Regular.ttf", FR_PRIVATE, NULL);


	// 设置字体样式
	settextstyle(50, 0, L"演示悠然小楷");		// "演示悠然小楷" 是字体文件对应的字体名称
	// 输出文字
	outtextxy(100, 100, L"EasyX 加载临时字体文件");


	// 释放临时字体资源
	RemoveFontResourceEx(L"res\\slideyouran-Regular.ttf", FR_PRIVATE, NULL);


	_getch();
	closegraph();

	return 0;
}

加载资源中的字体

对于资源中的字体,同样可以通过一系列 Windows API 函数将其作为临时字体加载。方法与加载外部字体文件类似,都有“加载”和“释放”两个步骤,具体如下:

首先,将下载的字体文件导入为字体资源。作为示例,导入的字体资源的 ID 为 IDR_FONT1。

然后,通过以下代码加载资源中的字体:

/////////////////////////////////////////////////////////
// 程序名称:加载临时字体文件
// 编译环境:Visual C++ 2010,EasyX_20220610,Unicode 字符集
// 作  者:慢羊羊@codebus
// 发布日期:2022-7-20
//
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include "resource.h"

int main()
{
	initgraph(640, 480);	// 初始化图形窗口


	// 临时加载字体资源
	HANDLE m_hFont;
	HRSRC res = FindResource(NULL, MAKEINTRESOURCE(IDR_FONT1), RT_FONT);	// 查找字体资源
	if (res)
	{
		HGLOBAL mem = LoadResource(NULL, res);		// 加载字体资源
		void* data = LockResource(mem);				// 锁定
		DWORD len = SizeofResource(NULL, res);		// 获取资源大小
		DWORD nFonts;
		m_hFont = AddFontMemResourceEx(	data,		// 参数:字体资源
										len,		// 参数:资源大小
										NULL,		// 参数:保留,必须为 0
										&nFonts);	// 参数:返回安装的字体数量
		if (!m_hFont)
			printf("字体加载失败!");
	}


	// 设置字体样式
	settextstyle(50, 0, L"演示悠然小楷");
	// 输出文字
	outtextxy(100, 100, L"EasyX 加载临时字体文件");


	// 释放临时字体资源
	RemoveFontMemResourceEx(m_hFont);


	_getch();				// 按任意键退出
	closegraph();

	return 0;
}

添加评论