问题标签 [directwrite]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - 如何在Delphi中使用DirectWrite在列表框的画布上绘制文本?
我正在寻找一个简单的示例来使用 TDirect2DCanvas 来绘制列表框的每个项目。谷歌搜索 DirectWrite 将结果提供给示例示例以在表单上呈现文本。作为一名学生,我的 Delphi 技能无法正确掌握教程。一个简单的例子或在画布上绘制文本的参考对我来说是一个很好的开始。
这是代码(旧的经典方法),我正在尝试使用 DirectWrite 来实现:
internationalization - 如何为 IDWriteTextLayout 指定歧义字符的方向性?
一些字符具有不明确的方向性,例如空格和标点符号。这可能会导致文本布局情况,在没有访问附加数据来解决歧义的情况下,似乎没有一个正确的布局。考虑这段文字:
那是四个希伯来字符(明确从右到左),四个英文字符(明确从左到右)和一个标点符号(不明确)。如果我将该字符串布局在IDWriteTextLayout
with 中DWRITE_READING_DIRECTION_RIGHT_TO_LEFT
,我会得到以下信息:
标点符号似乎被视为从右到左的字符,它在英语左侧开始一个新的从右到左的块,这似乎完全合理,特别是考虑到从右到左是指定的阅读方向。但是,将标点符号视为与嵌入的从左到右英文文本相关的从左到右字符也是完全合理的,这意味着它应该出现在“d”的右侧。
我的应用程序确切地知道它希望如何对待这个角色。我如何传递这些数据IDWriteTextLayout
来解决这种歧义?
我找到了SetLocaleName
方法并认为它一定是答案,但我似乎根本无法让它影响结果。我还在创建一个(然后用于创建)localeName
时找到了该参数。IDWriteTextFormat
IDWriteTextLayout
如果我的目标通常是带有嵌入美国英语字符串的希伯来语文本,我想我想在 上使用语言环境he
,IDWriteTextFormat
然后用字符范围 [4-9] 上SetLocaleName
的语言环境覆盖它。en-US
但是,这样做没有任何效果。事实上,无论我将它们限制在一个子范围还是将它们应用于整个字符串,我都无法在这些地方使用任何语言环境组合来对布局产生任何影响。
我认为这些 API 应该服务于这个目的是错误的吗?如果是这样,我应该使用哪些 API?还是真的没有办法告诉IDWriteTextLayout
以不同的方式解决这种歧义?我是否可能使用错误的 API?这是我用来创建它的测试代码IDWriteTextLayout
:
c++ - 无论如何我可以在 Directwrite TextLayout 中将宽度和布局宽度设置为相同吗?
每当我使用文本布局对象呈现文本时,很明显文本的实际宽度与布局的宽度不同,具体取决于文本换行中的启用选项。
我想知道是否有办法将宽度和布局宽度设置为相同?
因此,当我在创建文本布局对象时传入宽度和高度时,我希望它以我提供的确切尺寸呈现文本。
c++ - 我无法从 DirectWrite 获取此示例以在 V2015 中运行
我从 MS 的这个页面得到了下面的例子,但是由于这个消息,代码没有链接:
错误 LNK2019:函数 _wmain 中引用的未解析的外部符号 __imp__DWriteCreateFactory@12
我重复下面的代码以方便阅读:
由于这些是我在 DirectWrite 中的第一步,我对上面提到的错误消息一无所知。
c++ - DirectWrite:使用 IDWriteTextLayout::GetMetrics 时可能存在内存泄漏
似乎将IDWriteTextLayout::GetMetrics
内部的 COM 引用计数器增加IDWriteFactory
了 2,但IDWriteTextLayout
对象在销毁时根本不会减少它。结果IDWriteFactory
对象没有被破坏。这是一个错误,我说得对吗?
这是一个代码片段:
执行结果:
测试#:1,计数器 = 0
测试#:2,计数器 = 2
平台:带有平台更新的 Windows 7 x64 SP1。
编译器:Visual Studio 2015 更新 1。
c++ - C++ - DirectWrite:在运行时从文件中加载字体
我正在尝试在运行时从文件中加载字体并使用 DirectWrite 显示它。以下代码应使用该字体初始化 IDWriteTextFormat 对象:
它与系统字体完美配合,但我不知道如何加载自定义字体文件。我将不胜感激有关如何实现这一目标的任何示例。
到目前为止我尝试了什么:
• 我在 Stackoverflow 上阅读了这篇文章和这个问题,但我看不到应该在哪里传递字体文件的文件路径(因此,我完全无法实现这两个页面上提供的任何代码)
• 我也读过这篇文章,但如果我是对的,它与 DirectWrite (?) 无关(我尝试实现 AddFontResourceEx 方法,但无济于事)
• 最后,这个问题的答案建议使用 ResourceFontContext ::CreateFontCollection 可以解决问题,但在阅读此页面后(它是德语,但屏幕截图是英语)我相信它只能与作为资源嵌入的字体一起使用(在我的情况下这不是一个选项)
winapi - 在 Windows 上的自定义控件中处理任意文本输入的正确、现代方法是什么?WM_CHAR?国际模联?TSF?
我希望能够支持自定义 Windows 控件中的文本输入,就像 EDIT 和富编辑控件已经做的那样,但不继承其中任何一个。该控件当前使用 Direct2D 和 DirectWrite 来绘制文本,并在具有平台更新或更新版本的 Windows Vista SP1 上运行(如果我决定需要更新的 Direct2D 和 DirectWrite 功能,我可能会将其更改为具有平台更新或更新版本的 Windows 7 SP1,假设这些是在那里或仅在 Windows 8 上可用,但这是一个不同的问题......)
对于它的价值,在 OS XI 上将使用NSTextInputClient而在 GTK+ 上我将使用GtkIMContext。我说的就是这些。
显而易见的选择是使用WM_CHAR
,如果我正确收集,如果窗口类注册了RegisterClassW()
,则它本身就是 UTF-16,因此无论位置如何都应该“正常工作”。但是,WM_CHAR
是由 生成的TranslateMessage()
,它的文档说没有办法确定 aWM_CHAR
是否已经生成,因为TranslateMessage()
总是返回非零。我需要能够确定当前的键盘消息是否将由文本系统处理(因此应该被忽略);尤其如此,因为所有非文本键都需要以独立于布局的方式(我已经拥有)进行处理。
我还在 IMM API 和文本服务框架的 Windows 7 示例代码中看到。我不确定一个是否比另一个更好,而且他们似乎都在做同样的事情。他们有吗?
在 IMM 的情况下,有许多WM_IMM_xxx
消息我不确定是否应该忽略,而且我发现的每个参考似乎都不同意我是否应该在 Unicode 窗口中处理它们。 .. 此外,上述知道给定关键事件是否将由 IMM 处理的问题仍然存在;有办法吗?
TSF 有一个称为 ACP 的概念,它似乎允许我使用我想要的任何文本存储格式来存储我实际要使用的文本(即,不是正在进行的合成)。这是真的?我希望能够将我的文本存储为带有属性的 UTF-8,在绘图时转换为 UTF-16(用于 DirectWrite)。其他 API 选择是否也允许我这样做?
还是我完全走错了路?
我使用的其他参考资料:
谢谢。
更新2016 年 11 月 7 日
再次查看 TsfPad 示例后,我注意到它似乎也只是使用WM_CHAR
; 现在我不确定它是如何使用 TSF 的,除此之外......
c++ - 调用 ID2D1RenderTarget::DrawTextLayout() 不工作
基本上,给定以下测试代码:
target->DrawTextLayout 方法没有绘制任何东西。但是,以下对 DrawTextW 的调用确实有效:
以下是我所知道的摘要:
- TextFactory 是一个指向 IDWriteFactory 对象的指针,TextFormat 是一个 IDWriteTextFormat 对象,target 是一个有效的 ID2D1HwndRenderTarget。
- TextFormat 是一个有效的 IDWriteTextFormat 对象,因为我可以通过 DrawTextW 方法正确地用它绘制文本。
- 对 CreateTextLayout 的调用不返回错误代码,它返回 S_OK 成功代码。
- TextFormat 和文本布局对象都是使用同一个 DirectWrite 工厂创建的,这也是我的应用程序中存在的唯一 DirectWrite 工厂。
- ID2D1SolidColorBrush textBrush 是不透明度为 1.0 并设置为黑色的有效画笔。我知道这不是问题,因为 DrawTextW 正在使用此画笔成功绘制到窗口。
- 调用 ID2D1TextLayout 对象的 GetMetrics 方法返回有效指标;换句话说,对象中存储的文本的宽度和高度不是0或负数。
- 对 ID2D1RenderTarget::EndDraw() 的调用不返回错误代码,它返回 S_OK 成功代码。
- 最令人困惑的是,在我的代码的另一部分(恰好在另一个 dll 文件中),对 DrawTextLayout 的调用确实有效。即使此代码位于 dll 文件中,它也使用相同的 DirectWrite 工厂。我真的不认为在另一个 dll 文件中应该有所作为。
我提供的两个代码示例一个接一个地执行,并且都应该成功绘制文本。但是,只有 DrawTextW 正在绘制文本。我没有做任何复杂的绘图,例如使用 Direct 2D Effects。代码并不比我提供的示例复杂。现在我可以只使用 DrawTextW 方法,但我不希望这样做,因为我在某处读到它只是创建一个 IDWriteTextLayout 对象,绘制它,然后销毁该对象。这是很多不必要的工作,可以通过自己使用文本布局对象来缓解。
有谁知道为什么会发生这种情况?我完全不知道为什么会发生这种情况,尽管我会继续尝试在某个地方找到联系。
c++ - 如何修复 DirectWrite 中文本的随机修剪?
我正在显示我的应用程序的 fps。当我更改文本的大小或位置时,有时无法正确呈现并且布局矩形足够大。
有人知道怎么修这个东西吗?
示例代码,只有片段:
变量:
构造函数:
绘画:
渲染目标:
一切都很正常。我想这可以通过某种平滑来解决,或者我只是忘记了一些东西。
directwrite - IDWriteFontFace 什么时候可以有多个文件?
IDWriteFontFace.GetFiles()
返回字体文件的集合。这让我很困惑,因为我不知道有任何字体格式可以将单个字体拆分到多个文件中。(反之则不然;一个字体集合文件可以包含多个字体。)
事实上,在我的计算机上测试安装的字体时,我发现这个方法总是返回一个包含一个文件的集合。
问题:是否存在IDWriteFontFace.GetFiles()
返回多个文件的情况?