程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何列出系统上安装的唯一字体名称?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何列出系统上安装的唯一字体名称??

开发过程中遇到如何列出系统上安装的唯一字体名称?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何列出系统上安装的唯一字体名称?的解决方法建议,希望对你解决如何列出系统上安装的唯一字体名称?有所启发或帮助;

我正在设置 lf.lfFacename[0] = '\0';lf.lfCharSet = DEFAulT_CHARSET; 以枚举系统上安装的唯一字体名称,但我仍然收到重复的字体名称。我错过了什么?我得到这样的重复:

Font-name: [Cascadia Mono]
Font-name: [Cascadia Mono]
Font-name: [Cascadia Mono]
Font-name: [Cascadia Mono]
Font-name: [Cascadia Mono]
Font-name: [Cascadia Mono]
Font-name: [Cascadia Mono]
Font-name: [Cascadia Mono SemiBold]
Font-name: [Cascadia Mono SemiBold]
Font-name: [Cascadia Mono SemiBold]
Font-name: [Cascadia Mono SemiBold]
Font-name: [Cascadia Mono SemiBold]
Font-name: [Cascadia Mono SemiBold]
Font-name: [Cascadia Mono SemiBold]

我是这样枚举的:

#pragma comment(lib,"user32.lib")
#pragma comment(lib,"Comctl32.lib")
#pragma comment(lib,"Gdi32.lib")
#pragma comment(lib,"Uxtheme.lib")
#pragma comment(lib,"Comdlg32.lib")

#define WIN32_LEAN_AND_MEAN
#define UNICODE
#define _UNICODE

#include <windows.h>
#include <stdio.h>

LRESulT CALLBACK WndProc(HWND hwnd,UINT msg,WParaM wParam,LParaM lParam);

int CALLBACK enumFontsCallBACk(const LOGFont *lpelfe,const TEXTMETRIC *lpntme,DWORD      FontType,LParaM     lParam)
{
    wprintf(L"Font-name: [%s]\r\n",lpelfe->lfFaceName);
    return 1;
}

voID List()
{
    LOGFont lf = {0};
    lf.lfWeight = FW_DONTCARE;
    lf.lfOutPrecision = OUT_OUTliNE_PRECIS;
    lf.lfQuality = DEFAulT_QUAliTY;
    lf.lfCharSet = DEFAulT_CHARSET;
    lf.lfClipPrecision = CliP_DEFAulT_PRECIS;
    lf.lfPitchAndFamily = FF_DONTCARE;
    lf.lfFacename[0] = '\0';

    HDC dc = GetDC(null);
    EnumFontFamilIEsEx(dc,&lf,(FontENUMPROC)enumFontsCallBACk,0);
    ReleaseDC(NulL,dc);
}

int main()
{
    List();
    return 0;
}

解决方法

重复的原因在 REMARKs 下的文档中给出:“EnumFontFamiliesEx 将枚举相同字体的次数,因为字体中有不同的字符集。[.. .] 为了避免这种情况,应用程序应该过滤字体列表”。

要将列表过滤到唯一的字体名称,回调的 LPARAM 可用于构建以前遇到的字体名称的运行列表,并跳过重复项。

  • EnumFontFamiliesEx 调用需要更改为如下所示的内容。

      unordered_set<wString> wsFonts;
      EnumFontFamiliesEx(dc,&lf,(FONTENUMPROC)enumFontsCallBACk,(LPARAM)&wsFonts,0);
    
  • 然后回调可以根据列表检查当前字体名称。

      wString wsFont = lpelfe->lfFacename;
      if(((unordered_set<wString> *)lParam)->insert(wsFont).second)
          wcout << L"font-name: " << wsFont << endl;
    

为了 std::unordered_set 的方便,上面假设 C++,但当然可以使用手工制作的唯一字符串列表写入普通 C。

大佬总结

以上是大佬教程为你收集整理的如何列出系统上安装的唯一字体名称?全部内容,希望文章能够帮你解决如何列出系统上安装的唯一字体名称?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: