我正在开发一个标签设计程序,我遇到了一个非常奇怪的问题,我在互联网上的任何地方都找不到答案。
基本的解释是,当
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”,因为它不能用于打印。
不要使用Graphics.DrawString;它速度较慢,已弃用,不再推荐。
使用TextRenderer.DrawText。
图形.DrawString | TextRenderer.DrawString |
---|---|
不好 | 好 |
我们不想使用的那个 | 我们要使用的那个 |
使用GDI+进行文本渲染 | 使用GDI进行文本渲染 |
图形.MeasureString | TextRenderer.MeasureText |
图形.DrawString | TextRenderer.DrawText |
看起来更好了 | |
本地化更好 | |
更快 |
在.NET中有两种绘制文本的方法:
graphics.MeasureString
和 graphics.DrawString
)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
注意:
是 GDI 的包装,而TextRenderer
仍然是 GDI+ 的包装。graphics.DrawString