- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我的目标: 我想获取 IDWriteTextFormat 字体的高度,这样我就可以计算出在特定高度的 IDWriteTextLayout 中可以容纳多少行文本。
我的问题: 现在我正在使用这段代码来计算可见的行数:
inline int kmTextCtrl::GetVisLines() const
{
/* pTextFormat is an IDWriteTextFormat pointer, dpi_y is the desktop's vertical dpi,
and GetHeight() returns the height (in pixels) of the render target. */
float size = (pTextFormat->GetFontSize()/72.0f)*dpi_y;
return (int)(GetHeight()/size);
}
对于某些字体,计算似乎是准确的,但对于任何 TrueType 字体(例如:Courier New、Arial、Times New Roman)都不准确。对于这些字体,显示的文本被裁剪得远远低于渲染目标的垂直下边界。
一些上下文: 我正在制作一个文本回滚缓冲区控件,它使用 IDWriteTextLayout 将文本放入控件的呈现目标。我使用 GetVisLines() 的结果来确定将循环缓冲区(按行将文本存储在 std::strings 中)中的多少行文本拉入布局,并在每次滚动或调整窗口大小时重新创建它。
这是使用“ native ”Win32 API C++ 完成的。
最佳答案
最简单和最可靠的方法是仅向布局本身询问文本规范,因为这是它设计的两个目的之一,即绘图和测量。您将使用文本格式创建一个 IDWriteTextLayout
并调用 GetMetrics
以获取 DWRITE_TEXT_METRICS::height
。我猜你正在使用 ID2D1RenderTarget::DrawText
并传递文本格式,所以你可能没有直接创建布局,但调用 DrawText
就像调用 CreateTextLayout
自己,然后是 DrawTextLayout
。
请注意,通过较低层来获得此答案(IDWriteFontFace
等)会做出某些假设,即通用的世界就绪文本控件不应假设,例如假设将使用基本字体并且所有的线都是相同的高度。只要所有字符都出现在给定的基本字体中,这就可以解决(很可能你主要显示英语,这就是为什么所有字符都显示得很好),但会加入一些 CJK 或 RTL 语言或表情符号(这是一种基本字体像 Times New Roman 肯定不支持),并且行高会根据替换的字体相应地增加或缩小。 GDI 重新缩放替代字体,使它们适合基本字体的高度,但这会导致泰语和藏语等语言的字母变形不佳,需要更多的上升和下降空间。 IDWriteTextLayout
和 WPF/Word 中的其他布局将所有字体字形保持相同的 em 大小,这意味着它们在彼此相邻时排列得更好;但这确实意味着行高是可变的。
如果您只是绘制每一行文本,就好像它们的高度都相同,您会看到字形之间的重叠和行间不均匀的基线,或者控件顶部和底部的剪裁。所以理想的做法是使用每行的实际高度;但是如果你需要它们都具有相同的高度(或者如果它使控制过于复杂),那么至少使用 SetLineSpacing
和 DWRITE_LINE_SPACING_UNIFORM
设置一个明确的行间距基本字体 - 这样基线就会均匀间隔。
虽然出于好奇,IDWriteTextLayout 将行高计算为该行上所有运行高度的最大值,并且单次运行的高度(相同的字体和 em 大小)仅使用设计指标:ascent + descent,加上任何恰好存在的 lineGap(大多数字体将其设置为零,但 Gabriola 是大线间隙的一个很好的例子)。请注意,所有 em 大小均以 DIP 为单位(在典型的 96DPI 下表示 1:1,DIP 正好 == 像素),而不是点(1/72 英寸)。
(ascent + descent + lineGap) * emSize/designUnitsPerEm
关于c++ - Directwrite:获取字体的高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5589913/
我想将 DirectWrite 用于混合颜色文本格式(准确地说是语法突出显示),但似乎无法在 Layout 或 Typography 选项中找到方法。唯一的选择是在渲染文本时传递一个画笔,这对我不起作
我正在考虑将 DirectWrite 用于将在 DirectX 11 版本和 OpenGL 3.1+ 版本中推出的项目。 据了解,DirectWrite 使用位于 Direct3D 10.1 之上的
我正在尝试将我必须绘制的文本居中对齐。我用 ID2D1RenderTarget::DrawTextLayout method .问题是,如果我将文本水平对齐方式设置为 DWRITE_TEXT_ALIG
我使用 CreateTextLayout 和 CreateTextFormat 通过 DirectWrite (C++) 绘制文本,文本是混合的希伯来语/英语,有没有办法使用不同的字体/字体拉丁字符和
我的目标: 我想获取 IDWriteTextFormat 字体的高度,这样我就可以计算出在特定高度的 IDWriteTextLayout 中可以容纳多少行文本。 我的问题: 现在我正在使用这段代码来计
我正在使用 DirectWrite 将一些文本呈现到窗口中。使用不同的字体大小时,除了定位外,一切似乎都有效:我希望 2 个文本的字体大小为 v1 和 v2,并且都带有 (x, y) = (0, 0)
DirectWrite ScriptAnalysis包含一个 UINT16 数字,它是编写系统脚本的从零开始的索引表示。 我怎么知道脚本的名字?例如,在英语中该数字等于 49,而在俄语中该数字等于 2
CreateTextFormat 的文档没有提到字体回退选择,但如果选择了默认(NULL = 系统)集合,那么 DirectWrite 清楚地实现了字体回退。例如,如果我将 Gabriola 字体中未
使用 HitTestTextPosition样式 API 来自 IDWriteTextLayout我没有设法正确处理“ti”、“ffi”或其他带有 Calibri 等字体的连字中的文本位置。它总是在连
我已经知道亚像素定位会导致DirectWrite text rendering to be blurry compared to GDI。 但是,我的问题更为根本:为什么不能使用DirectWrite
使用 DirectWrite 和 Direct2D1,我试图模仿 Illustrator CS6 对区域文本框所做的渲染。 CS6 有一个选项,其中基线可以放置在距离区域文本框顶部的距离等于字体的“e
DirectWrite 通过 IDWriteTextAnalysisSink::SetLineBreakpoints() 提供换行信息。但是,我还需要根据 Unicode Annex #29: Uni
ID2D1RenderTarget::DrawGlyphRun 采用以下参数: D2D1_POINT_2F baselineOrigin, __in CONST DWRITE_GLYPH_RUN *g
我正在使用 Embarcadero RAD Studio XE7 编译器(C++ Builder),我正在尝试提供的 Direct2D API。我的目的是创建提供与 GDI 完全相同的渲染的应用程序,
我正在尝试了解 DirectWrite API,这样我就可以获得一个灵活的解决方案来解决从任何文化中呈现文本的问题,并有可能使用它来将富文本编辑合并到一个比“固定的”编辑/显示文本的方式。 PadWr
我使用 IDWriteTextAnalysisSink/AnalyzeScript 在 DirectWrite (C++) 中显示混合的 LTR(英语)和 RTL(希伯来语)文本,并根据以下公式计算文
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
我只是在使用 C++ 中的 DirectWrite 工作,这似乎解决了我在不同渲染目标(屏幕和打印机)中具有相同布局的需求。 我仔细检查了 HelloWorld 示例 ( http://msdn.mi
我需要将使用 GDI 和 GDI+ 的现有 C++ 代码中的一些文本到位图渲染例程转换为使用 DirectWrite(需要 CFF 支持和 OTF 功能支持)。 我是 DirectWrite 的新手。
在 IE10 以上的几乎所有方面我都更喜欢谷歌浏览器,但我讨厌的一件事是字体在 IE10 中看起来好多了。这在使用小型数学字体时尤其明显。它们在 IE10 中看起来像 pdf 质量。 稍微查找了一下,
我是一名优秀的程序员,十分优秀!