有没有人知道如何让IDWriteTextLayout调整布局,以便字形不会超出布局边界?当与LHS或RHS对齐时,在某些字体下使用斜体(如“f”)时尤其如此。
默认情况下,GDI +的行为方式如下(请参阅:StringformatFlagsNoFitBlackBox)。一种选择是实现自定义布局..但这似乎过于复杂。如果可能的话,我更愿意使用标准布局。
答案 0 :(得分: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);
答案 1 :(得分:0)
SetOpticalAlignment(DWRITE_OPTICAL_ALIGNMENT opticalAlignment)
和IDWriteTextFormat1
中有IDWriteTextLayout2
。根据{{3}},
默认情况下,字形通过字形的默认原点和侧面轴承与页边距对齐。如果指定
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.
我还没有尝试过,所以我不能说它是否适合您的情况。 :-(