没有窗口的 GetFontUnicodeRanges

2024-05-26

有机会打电话吗GetFontUnicodeRanges没有窗户?例如,它可能是不允许与桌面交互的 Windows 服务。

目前我正在使用控制台应用程序对此进行测试:

program UnicodeConsoleOutput;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Windows;

var
  NumWritten: DWORD;
  Text: WideString;
  u8s: UTF8String;

procedure Add(AStart, AEnd: Word);
var
  i: Word;
begin
  Text := Text + WideFormat('[%x...%x]:'#13#10, [AStart, AEnd]);
  for i := AStart to AEnd do
    Text := Text + WideChar(i);
  Text := Text + WideString(#13#10#13#10);
end;

//Actually I want to get glyph ranges for "Consolas" font
procedure GetFontRanges();
type
  TRangesArray = array[0..(MaxInt div SizeOf(TWCRange)) - 1] of TWCRange;

  PRangesArray = ^TRangesArray;
const
  ConsoleTitle = '{A46DD332-0D57-4310-B91E-A68957C20429}';
var
  GS: PGlyphSet;
  GSSize: LongWord;
  i: Integer;
  rng: TWCRange;
  hConsole: HWND;
  hDev: HDC;
begin
  //A dirty hack to get console window handle suggested by Microsoft
  SetConsoleTitle(PChar(ConsoleTitle));
  hConsole := FindWindow(nil, PChar(ConsoleTitle));
  
  hDev := GetDC(hConsole);
  try

    GSSize := GetFontUnicodeRanges(hDev, nil);
    GetMem(Pointer(GS), GSSize);
    try
      GS.cbThis := GSSize;
      GS.flAccel := 0;
      GS.cGlyphsSupported := 0;
      GS.cRanges := 0;
      if GetFontUnicodeRanges(hDev, GS) <> 0 then begin
        for i := 0 to GS.cRanges - 1 do begin
          rng := PRangesArray(@GS.ranges)[i];
          Add(Word(rng.wcLow), Word(rng.wcLow) + rng.cGlyphs - 1);
        end;
      end;
    finally
      FreeMem(Pointer(GS), GSSize);
    end;
  finally
    ReleaseDC(hConsole, hDev);
  end;
end;

begin
  try
    GetFontRanges();
    SetConsoleOutputCP(CP_UTF8);
    u8s := UTF8Encode(Text);
    WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), PChar(u8s), Length(u8s),
      NumWritten, nil);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  ReadLn;
end.

在 Windows GDI 中,您可以创建设备上下文并在其中选择字体,而无需窗口句柄。例如。,

        HDC hdc = CreateDC(L"DISPLAY", NULL, NULL, NULL);
        //CreateCompatibleDC(NULL) also works

        HFONT hFont = CreateFont(
            -20, 0, 0, 0,
            FW_REGULAR,
            FALSE, FALSE, FALSE, DEFAULT_CHARSET,
            OUT_DEFAULT_PRECIS,
            CLIP_DEFAULT_PRECIS,
            DEFAULT_QUALITY,
            DEFAULT_PITCH || FF_DONTCARE,
            L"Arial"
        );

        HFONT oldFont = static_cast<HFONT>(SelectObject(hdc, hFont));

请注意,GDI 文本函数使用 UTF-16 编码,并且所有这些函数都是在 Unicode 分配任何补充平面字符之前创建的。因此,获取或返回非字符串字符列表的函数(例如 GetFontUnicodeRanges)对于当今的大部分 Unicode 都不能很好地工作。获取字体Unicode范围 https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-getfontunicoderanges返回一个指向 a 的指针GLYPHSET https://learn.microsoft.com/en-us/windows/win32/api/wingdi/ns-wingdi-glyphset,其中有一个数组WCRANGE https://learn.microsoft.com/en-us/windows/win32/api/wingdi/ns-wingdi-wcrange结构。它有一个 WCHAR 来表示一个 Unicode 字符。因此,GetFontUnicodeRanges 无法报告任何 Unicode 补充平面字符。在某些字体中,这可能是字体中支持的大多数字符。

从这一点来看,GDI 不仅古老,而且已经过时。对于您正在做的事情,DirectWrite 是一个更好的选择:它的所有 API 都支持所有 Unicode 字符。

你想要的 DWrite 方法是IDWriteFontFace1::GetUnicodeRanges https://learn.microsoft.com/en-us/windows/win32/api/dwrite_1/nf-dwrite_1-idwritefontface1-getunicoderanges。许多 DWrite API(包括此 API)都可以在没有窗口甚至设备上下文的情况下使用。您可能希望通过调用来获取 IDWriteFontFace1 对象IDWriteFont::CreateFontFace https://learn.microsoft.com/en-gb/windows/win32/api/dwrite/nf-dwrite-idwritefont-createfontface, IDWriteFactory::CreateFontFace https://learn.microsoft.com/en-us/windows/win32/api/dwrite/nf-dwrite-idwritefactory-createfontface or IDWriteFontFaceReference::CreateFontFace https://learn.microsoft.com/en-us/windows/win32/api/dwrite_3/nf-dwrite_3-idwritefontfacereference-createfontface根据您感兴趣的字体的来源,可以是已安装的字体、自定义字体集、内存 blob 或字体文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

没有窗口的 GetFontUnicodeRanges 的相关文章

  • Android并计算给定字体和字体大小的单行字符串的大小?

    是否有一种 API 方法可以计算以给定字体和字体大小显示在一行上的字符串的大小 即宽度和高度 Paint p new Paint p setTypeface TypeFace obj if custom font use TypeFace
  • DLL 中的 XP 风格组合框

    我需要使用 C 和 WIN32 API 无 MFC 在 DLL 中创建 XP 风格的组合框 我设法在 DLL 中创建控件 不是以 XP 风格 我设法在带有清单的 exe 中创建 XP 样式组合框 但它在 DLL 中不起作用 为了让您的 DL
  • FAT-32 上的 Unicode 文件名?

    据我了解 NTFS 支持 Unicode 文件名 正如 Microsoft 声称的那样 UTF 16 但官方 MSDN 文档对于使用什么代码页在 FAT 32 上存储文件名 文件路径 非常模糊 这里说的是OEM 代码页 我假设是CP437
  • 当前从解码字符串中删除“surrogateescape”字符的习惯用法

    阿明 罗纳彻 http lucumr pocoo org 2013 7 2 the updated guide to unicode http lucumr pocoo org 2013 7 2 the updated guide to u
  • 正则表达式匹配埃及象形文字[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想知道一个匹配埃及象形文字的正则表达式 我完全一无所知 需要你的帮助 我无法发布这些字母 因为堆栈溢出似乎无法识别它 那么谁能告诉我这些
  • 为什么 Windows 只允许一个应用程序访问网络摄像头? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我一直在尝试用 C 制作一个示例网络摄像头应用程序 我发现该应用程序无法同时运行 Skype 或 Oovoo 或任何其他应用程序运行 反之亦然 为什么
  • 为什么 Python 不能打印 Unicode 符号? [复制]

    这个问题在这里已经有答案了 可能的重复 Python UnicodeDecodeError 我是否误解了编码 https stackoverflow com questions 368805 python unicodedecodeerro
  • python:unicode问题

    我正在尝试解码从文件中获取的字符串 file open Downloads lamp post csv r data file readlines data 0 xff xfeK x00e x00y x00w x00o x00r x00d
  • 使用 Python 将 Excel 中的图表导出为图像

    我一直在尝试将 Excel 中的图表导出为 Python 中的图像文件 JPG 或 ING 我正在查看 WIn32com 这是我到目前为止所拥有的 import win32com client as win32 excel win32 ge
  • HBRUSH 转 RGB 值

    你能得到RGB值吗HBRUSH或者从刷子ID 例如 我正在寻找GRAY BRUSH以 RGB 值表示 您想使用获取对象 http msdn microsoft com en us library windows desktop dd1449
  • 如何将CString转换为整数和浮点数? [复制]

    这个问题在这里已经有答案了 我正在尝试转换CStringint 和 float 但无法找到任何 C 库函数来完成此操作 请帮忙 正确的UNICODE 符合规定的方式MFC如下 CString sInt T 10 int n ttoi sIn
  • 以编程方式最小化/恢复窗口,跳过动画效果

    我需要对窗口列表执行多项操作 最小化其中一些 恢复其他 以便立即在两组或多组窗口之间切换 这样做的问题是最小化和恢复窗口时可以看到的动画 整个过程看起来很糟糕 所有这些动画都进进出出 上下移动 但是 我无法禁用这些动画 因为这是针对其他计算
  • 移动/调整窗口大小时闪烁

    我开发了一个显示 jpeg 图像的应用程序 它可以显示 4 个图像 屏幕的每个象限各一个 为此 它使用了 4 个窗口 窗口没有边框 框架 也没有标题栏 当加载新图像时 窗口大小会根据新图像进行调整 然后显示该图像 尤其是当窗户做得较大时 经
  • 为什么字体扩展仅适用于 PDF,而不适用于其他格式(HTML、XLS、DOC)?

    通过 Jaspersoft Studio 我们使用以下设置将用于 Web 应用程序的内置 Windows Calibri 字体变体导出到字体扩展 JAR 中 导出的jrfontextensions jar内的目录结构如下 jrfontext
  • 无法在 Python 2.4 中解码 unicode 字符串

    这是Python 2 4 中的 这是我的情况 我从数据库中提取一个字符串 它包含一个变音的 o xf6 此时 如果我运行 type value 它会返回 str 然后我尝试运行 decode utf 8 但收到错误 utf8 编解码器无法解
  • 更换 I 过滤器

    我目前正在使用 IFilters 从各种文件 word excel tiff pdf 等 中提取文本 据我所知 IFilter 已在 Windows 8 中停止使用 是否有人对如何在不安装本机应用程序的情况下提取文本有任何建议 如果有什么用
  • Perl 和 Unix 如何以相同的顺序对 Unicode 字符串进行排序?

    我正在尝试获取 Perl 和 GNU Linuxsort 1 程序就如何对 Unicode 字符串进行排序达成一致 我在跑sort with LANG en US UTF 8 在Perl程序中我尝试了以下方法 use Unicode Col
  • PHP:读取字体文件的 TrueType/OpenType 元数据

    如何阅读字体详细信息 例如 字体在其元数据中包含版权 姓氏 设计者 版本等信息 我还希望脚本能够计算文件中的字形数量 并返回字体支持的语言 例如 典型的字体可能包含西方语言 瑞典语和罗马语言支持 并具有数百个字形 它应该支持 truetyp
  • 用于 UTF8 到 1252 的 Windows C API

    我熟悉 WideCharToMultiByte 和 MultiByteToWideChar 转换 可以使用它们来做类似的事情 UTF8 gt UTF16 gt 1252 我知道 iconv 会满足我的需要 但是有人知道任何 MS 库可以在一
  • Windows 窗口对接

    我想知道如何在 Windows 中将窗口停靠 捕捉到屏幕的一侧 最好使用直接的 Win32 API 我正在寻找的效果就像任务栏 一个在屏幕上有保留空间的窗口 因此最大化另一个窗口会使该窗口占据屏幕的其余部分 但使我的窗口保持在适当的位置并可

随机推荐

  • ASP.Net 将 401 错误代码转换为 302 错误代码

    我有一个自定义处理程序 在某些情况下 我想向用户代理表明他们未获得授权 Http 错误代码 401 if IsAuthorized context context Response StatusCode 401 context Respon
  • 使用表达式树构造 LINQ GroupBy 查询

    我已经在这个问题上坚持了一个星期了 但没有找到解决方案 我有一个像下面这样的 POCO public class Journal public int Id get set public string AuthorName get set
  • PHP/PDO 和 SQL Server 连接以及 i18n 问题

    在我们的网络应用程序中 我们使用 PHP5 2 6 PDO 连接到 SQL Server 2005 数据库并存储俄语文本 数据库排序规则是Cyrillic General CI AS 表排序规则是Cyrillic General CI AS
  • VB6 ActiveX exe - 正确的注册顺序是什么?

    我最近更新了一个 Visual Basic 6 应用程序 它是一个 ActiveX exe 在 Windows XP 上运行 我有几个此应用程序的测试人员 他们已收到 exe 的副本并正在尝试运行它 但是 他们收到一条错误消息 Unexpe
  • 从 Redux 状态删除一个项目

    我想知道如果可能的话你是否能帮我解决这个问题 我正在尝试从 Redux 状态中删除一个项目 我已经传入了用户点击的项目的IDaction data进入减速机 我想知道如何匹配action data使用 Redux 状态中的 ID 之一 然后
  • 从 UIScrollView 中删除所有子视图?

    如何从 UIScrollview 中删除所有子视图 Let scrollView是一个实例UIScrollView 在 Objective C 中 这非常简单 只需致电makeObjectsPerformSelector 像这样 Objec
  • SQL Server 2005 中的计数(*) 与计数(Id)

    我使用 SQLCOUNT函数获取表中的总数或行数 以下两种说法有什么区别吗 SELECT COUNT FROM Table and SELECT COUNT TableId FROM Table 另外 在性能和执行时间方面有什么区别吗 Th
  • 设置 MySQL 触发器

    我听说过有关触发器的事情 我有几个问题 什么是触发器 我该如何设置它们 除了典型的 SQL 内容之外 是否还应该采取任何预防措施 触发器允许您在发生某些事件 例如 插入表 时在数据库中执行某个功能 我无法具体评论mysql 注意事项 触发器
  • 在字符串数组中查找下一个可用日期

    我一直在尝试找出如何根据当前日期获取下一个可用日期 即 如果今天是星期五 则在数组中搜索下一个最近的日期 例如数组值为 1 星期一 2 星期二 4 星期四 6 星期六 那么我的第二天应该是星期六 这是我尝试过的 Here i ll get
  • RecyclerView 上的删除按钮删除了错误的项目

    我正在使用 Firestore 适配器RecyclerView我在使用 删除 按钮时遇到问题 当我按下它时 它会删除错误的项目 而不是我想要的项目 这是我的按钮内部的代码onBindViewHolder protected void onB
  • 了解单目标迷宫的 A* 启发式

    我有一个像下面这样的迷宫 P
  • 传说在北卡罗来纳州地理地图上消失?

    我正在使用 R 编程语言 使用北卡罗来纳州的内置地图 我生成了 3 个随机变量 收入 孩子数量 体重 然后为此数据创建了地图 使用 传单 库 通过循环 library sf library mapview library leaflet l
  • jQuery Mobile 1.4.0:动态更改页面的标题和标题

    动态更改 jQuery Mobile 1 4 0 页面的标题 data role header 和 title 的正确方法是什么 添加方法有很多种toolbars 页眉 页脚 动态 此外 jQuery Mobile 1 4 提供intern
  • 检测堆栈已满

    在编写 C 代码时 我了解到使用堆栈来存储内存是一个好主意 但最近我遇到了一个问题 我有一个实验 其代码如下所示 void fun const unsigned int N float data 1 N N float data 2 N N
  • python:将base64编码的png图像转换为jpg

    我想使用 python 将一些 base64 编码的 png 图像转换为 jpg 我知道如何从 Base64 解码回原始 import base64 pngraw base64 decodestring png b64text 但现在我怎样
  • 土耳其语字符显示不正确[重复]

    这个问题在这里已经有答案了 MySql 数据库使用 utf 8 编码 数据存储正确 我使用 set name utf8 查询来确保调用的数据是 utf 8 编码 只要标头字符集是 utf 8 数据库中的所有变量都可以正常工作 但静态html
  • 无需发送消息即可获取 GCM 规范注册 ID

    我在使用 GCM 的应用程序时遇到问题 情况如下 该应用程序已安装 应用程序调用 GCM 注册方法获取注册 ID RID 1 该应用程序已卸载 再次安装该应用程序 应用程序再次调用 GCM 注册方法 获取注册 ID RID 2 在第 5 步
  • 如何在张量流中使用带有估计器的衰减学习率?

    我正在尝试将 LinearClassifier 与具有衰减学习率的 GradientDescentOptimizer 一起使用 My code def main load data features np load data feature
  • Wordpress/Woocommerce:以编程方式创建订单后,我还想以编程方式发送发票...如何?

    所以 我的网站涉及一个预订系统 流程如下 客人选择预订产品的日期 地点 提交请求后 系统会向主机发送一条消息以供审核 如果接受 我希望订单由客人支付 我的问题在这里 我已成功创建订单 理想情况下 我希望能够将客人发送到他们的 购物车 页面
  • 没有窗口的 GetFontUnicodeRanges

    有机会打电话吗GetFontUnicodeRanges没有窗户 例如 它可能是不允许与桌面交互的 Windows 服务 目前我正在使用控制台应用程序对此进行测试 program UnicodeConsoleOutput APPTYPE CO