Graphics.DrawString 奇怪的异常字距调整

问题描述 投票:0回答:1

我正在开发一个标签设计程序,我遇到了一个非常奇怪的问题,我在互联网上的任何地方都找不到答案。

基本的解释是,当

layoutRectangle
DrawString()
属性设置为稍高于文本长度的大小时,字距调整似乎会关闭。使用字符“Te”组合时效果最佳。

使用“layoutRectangle”正确字距调整,使其足以适合文本:

错误的字距调整,“layoutRectangle”大于适合文本的大小:

您可能会发现第二张图像中的“e”比第一张图像中的绘制得更远。我在一个新项目上尝试过,同样的事情发生了。即使根本不指定

layoutRectangle
,您也可以观察到相同的行为。

这是绘制字符串的代码行:

canvasGraphics.Graphics.DrawString(
    _displayText.FormattedTextValue,
    new Font(FontName, (float)((drawFontSizeToUse / 72d) * Canvas.RenderDPI), fontStyle, GraphicsUnit.Pixel),
    Brushes.Black,
    (Rectangle)new RectangleD(ScreenBounds.X, ScreenBounds.Y, ScreenBounds.Width, ScreenBounds.Height),
    stringFormat
);

stringFormat
只是根据设置更改对齐方式。

有人知道如何解决这个问题吗?

谢谢你。

我尝试过操纵不同的

StringFormat
TextRenderingHint
和任何
Font
选项等。(尽管可能有一些我不知道。)

我无法使用“TextRenderer”,因为它不能用于打印。

c# winforms gdi+
1个回答
0
投票

简短版

不要使用Graphics.DrawString;它速度较慢,已弃用,不再推荐。

使用TextRenderer.DrawText

图形.DrawString TextRenderer.DrawString
不好
我们不想使用的那个 我们要使用的那个
使用GDI+进行文本渲染 使用GDI进行文本渲染
图形.MeasureString TextRenderer.MeasureText
图形.DrawString TextRenderer.DrawText
看起来更好了
本地化更好
更快

长版

在.NET中有两种绘制文本的方法:

  • GDI+(
    graphics.MeasureString
    graphics.DrawString
  • GDI(
    TextRenderer.MeasureText
    TextRenderer.DrawText

来自 Michael Kaplan 的(翻录)优秀博客 Sorting It All Out,在 .NET 1.1 中,一切都使用 GDI+ 进行文本渲染。但也有一些问题:

  • GDI+ 的无状态性质会导致一些性能问题,其中设备上下文将被设置,然后在每次调用后恢复原始值。
  • Windows/Uniscribe 和 Avalon (Windows Presentation Foundation) 的国际文本整形引擎已更新多次,但尚未更新 GDI+,这导致对新语言的国际渲染支持不具有相同的质量水平。

所以他们知道他们想要更改 .NET 框架以停止使用 GDI+ 的文本渲染系统,并使用 GDI。起初他们希望能够简单地改变:

graphics.DrawString

调用旧的

DrawText
API 而不是 GDI+。但他们无法使文本换行和间距与 GDI+ 完全匹配。所以他们被迫保留
graphics.DrawString
来调用 GDI+(兼容性原因;调用
graphics.DrawString
的人会突然发现他们的文本没有像以前那样换行)。

创建了一个新的静态

TextRenderer
类来包装 GDI 文本渲染。它有两种方法:

TextRenderer.MeasureText
TextRenderer.DrawText

注意:

TextRenderer
是 GDI 的包装,而
graphics.DrawString
仍然是 GDI+ 的包装。

奖励阅读

© www.soinside.com 2019 - 2024. All rights reserved.