有没有人知道如何让IDWriteTextLayout调整布局,使字形不会超出布局边界?当与LHS或RHS对齐时,某些字体下的斜体(如'f')尤其会出现这个问题。
GDI+默认的行为是这样的(参见:StringformatFlagsNoFitBlackBox)。一种选择是实现自定义布局。但这似乎过于复杂了。如果可能的话,我更喜欢使用标准布局。
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);
在IDWriteTextFormat1
和IDWriteTextLayout2
中有SetOpticalAlignment(DWRITE_OPTICAL_ALIGNMENT opticalAlignment)
。根据文档
默认情况下,字形通过字形的默认原点和侧面方向与页边距对齐。如果您指定
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.
我没有试过,所以我不能说它是否适用于你的情况。: - (