IDWriteTextLayout斜体文本问题

时间:2013-05-28 15:49:55

标签: directwrite

有没有人知道如何让IDWriteTextLayout调整布局,以便字形不会超出布局边界?当与LHS或RHS对齐时,在某些字体下使用斜体(如“f”)时尤其如此。

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

2 个答案:

答案 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.

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