如果不是系统自带的字体,程序想在运行时使用,但又不想将字体文件安装到系统中。如何处理呢?步骤如下:
(1)获取字体文件,如阿里的iconfont,可以将图标字体文件下载下来,并查看html中的unicode码。
(2)将字体文件生成资源文件,编译到exe文件中去。如字体文件名为f.ttf,已放在当前工程的res文件夹中。用记事本,编写如下内容,保存为1.rc
F1 BINARY "\res\iconfont.ttf"
将1.rc添加到工程中,会生成res文件,且会被编译到exe文件中去。
(3)调用字体如下,分两步:
//1.生成字体文件
void __fastcall TForm1::Button6Click(TObject *Sender)
{
TResourceStream * pRes = new TResourceStream((unsigned)HInstance, AnsiString("F1"), "BINARY");
pRes->SaveToFile("c:\\1.ttf");//将exe中的字体文件读出来,保存到指定位置
AddFontResourceA("c:\\1.ttf");//将字体文件添加到系统中,直到windows重启前有效
SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0);//广播消息
}
//2.调用字体
void __fastcall TForm1::Button8Click(TObject *Sender)
{//调用字体
Button8->Font->Name = "iconfont";//阿里字体名,和“宋体”、“微软雅黑”类似,可以打开ttf查看
Button8->Font->Size = 16;//字体大小
char* a = "\ue612";//字体unicode,在html中是<div class="code-name">&#xe612;</div>
Button8->Caption = a;
}
另一种调用方法是,不生成ttf文件,而是将字体加载到内存中,再调用,如下:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HINSTANCE hInstRes = HInstance;//HInstance是C++Builder中的常量,也可以通过GetModuleHandle(NULL)函数获取程序实例句柄
HRSRC hRsrc = FindResource(hInstRes, "F1", "BINARY");
DWORD cbSize = SizeofResource(hInstRes, hRsrc);
HGLOBAL hMem = LoadResource(hInstRes, hRsrc);
LPVOID pvData = LockResource(hMem);
DWORD nFontsInstalled = 0;
HANDLE hFontInstalled = AddFontMemResourceEx(pvData, cbSize, NULL, &nFontsInstalled);
Button1->Font->Handle = hFontInstalled;//将内存中的字体与控件绑定
Button1->Font->Name = "iconfont";
Button1->Font->Size = 20;
WCHAR c = 0xe61b;//阿里图形字体的unicode,由阿里字体自动生成
Button1->Caption = WideString(c);
//可以卸载内存中的字体
//RemoveFontMemResourceEx(hFontInstalled);
}