调用资源中的字体文件

如果不是系统自带的字体,程序想在运行时使用,但又不想将字体文件安装到系统中。如何处理呢?步骤如下:
(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">&amp;#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);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值