2

有谁知道让 IDWriteTextLayout 调整布局以使字形不会超出布局边界的方法?当与 LHS 或 RHS 对齐时,在某些字体下使用诸如“f”之类的斜体尤其是一个问题。

GDI+ 默认以这种方式运行(请参阅:StringformatFlagsNoFitBlackBox)。一种选择是实现自定义布局..但这似乎过于复杂。如果可能的话,我更喜欢使用标准布局。

4

2 回答 2

0

IDWriteTextLayout 总是使用字形的布局边界(字形原点和前进宽度)而不是墨迹将字形对齐到布局范围,这意味着由于斜体斜率或像 Gabriola 的花哨的装饰(至少在 Win7 和 8 上),墨迹确实会溢出到外面.

我认为,除了编写自己的自定义布局之外,您最好的选择是包含一些明确的边距(使布局大小小于控制区域)或扩展任何剪辑区域以允许墨水溢出某些区域。这就是为什么常见的 EDIT 控件和 CSS 默认为一些填充的原因之一。要估计填充,您可以只使用从其他 UI 设置派生的固定值、字体大小的比例,或者测量一次以获得 DWRITE_OVERHANG_METRICS 并使用调整/缩小的大小再次调整大小。

textLayout->SetMaxWidth(initialMaxWidth);
textLayout->GetOverhangMetrics(OUT &overhangMetrics);
float newSmallerWidth = initialMaxWidth
                      - std::max(overhangMetrics.left,  0.0f)
                      - std::max(overhangMetrics.right, 0.0f);
textLayout->SetMaxWidth(newSmallerWidth);
于 2013-09-21T00:27:01.377 回答
0

有和。SetOpticalAlignment(DWRITE_OPTICAL_ALIGNMENT opticalAlignment)_ 根据文档IDWriteTextFormat1IDWriteTextLayout2

默认情况下,字形通过字形的默认原点和边距与边距对齐。如果您指定DWRITE_OPTICAL_ALIGNMENT_NO_SIDE_BEARINGS,则对齐使用侧轴承从对齐的边缘偏移字形,以确保字形的墨水对齐。

但是,DWRITE_2.H有一条评论DWRITE_OPTICAL_ALIGNMENT_NO_SIDE_BEARINGS说明:

/// Align glyphs to the margins. Without this, some small whitespace
/// may be present between the text and the margin from the glyph's side
/// bearing values. Note that glyphs may still overhang outside the
/// margin, such as flourishes or italic slants.

我还没有尝试过,所以我不能说它是否适用于你的情况。:-(

于 2019-08-20T13:04:51.213 回答