如何引用外部字体

belsai 2021-03-22 07:54:09
出于保护字体的需要,字体文件保存在数据库中,在程序启动时载入,退出时删除,只限本进程使用
目前只能通过AddFontResource加载磁盘上的字体文件在FontDialog中才可以使用,而通过AddFontMemResourceEx加载内存中的资源在FontDialog中不能显示,CreateFont(0, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,DEFAULT_PITCH, PChar('zh-d'))也没有效果,是为什么呢?
...全文
3284 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
想到一种实现方式:
首先要把你的字体文件做出一个简版,比如只包括西文字符和字体对话框简例的那几个汉字,然后程序带上这些字体文件即可(也不用打包到exe中了),安装或者程序启动的时候用AddFontResource注册了,字体对话框中可以看到。实际使用中判断一下字体名是不是自己的字体,如果是话,AddFontMemResourceEx获得自己捆绑的全版字体handle,赋值给Font.Handle即可
belsai 2021-04-01
  • 打赏
  • 举报
回复
国内对版权的概念还是比较原始,这些年虽然有提升毕竟有限,对小公司来说打官司实在是费时费力,只能尽量提升破解难度吧
tanqth 2021-04-01
  • 打赏
  • 举报
回复
还有一种方式,由自己重新实现一次FontDialog,把自己的字体增加上去。
  • 打赏
  • 举报
回复
个人感觉字体真的没那么重要,免费的很多,中文的:https://www.freechinesefont.com/,西文的就更多了
belsai 2021-03-31
  • 打赏
  • 举报
回复
内存字体不能被枚举这个我也看到了,就是不知道后续有没有解决办法,感觉CreateFont应该可以的,但试了不行,不知道是差了什么,现在关于windows API方面的书在实体书店也很难找到了
  • 打赏
  • 举报
回复
保护字体的最好方法是版权保护,不是加密之类的。做成资源带在exe中,随便用个工具(PE Resource Explorer等等)也抓出来了
tanqth 2021-03-26
  • 打赏
  • 举报
回复
在XE作之后的系统中,Delphi中还有StylesSettings.ssFamily:Boolean属性,必须设置为False才能使自定义字体系列工作.与Size,Style和FontColor相同. 要在FontDialog中使用,需要新增注册表数据。


sFontFileName := 'XXXXXXX.ttf';

  //新增注册表项
  reg := TRegistry.Create;
  reg.RootKey := HKEY_LOCAL_MACHINE;
  try
    if reg.OpenKey('\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts', false) then
    begin
      if not reg.ValueExists('你的字体名 (TrueType)') then
        reg.WriteString('你的字体名(TrueType)', sFontFileName);
    end;
  finally
    reg.Free;
  end;
  //通知系统更新字体列表
  PostMessage(HWND_BROADCAST,  WM_FONTCHANGE,  0,  0);
  • 打赏
  • 举报
回复
字体对话框是通过EnumFontFamilies/ EnumFontFamiliesEx枚举字体的,AddFontMemResourceEx的备注中明确说明
Font that is added by AddFontMemResourceEx is always private to the process that made the call and is not enumerable.
所以是否能在对话框中列出有待验证
tanqth 2021-03-26
  • 打赏
  • 举报
回复
引用 3 楼 早打大打打核战争 的回复:
他的是内存字体,注册不了的
注册表,不检查文件的。有没有实际的文件,并不影响。
  • 打赏
  • 举报
回复
他的是内存字体,注册不了的
belsai 2021-03-25
  • 打赏
  • 举报
回复
网上搜到的代码都不能在FontDialog中显示出通过AddFontMemResourceEx安装的外部字体,哪位朋友做过这方面的代码贴一段看看呗!非Delphi的代码也行啊,有个参考,不胜感谢!

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧