如果我使用 TextRenderer.DrawText()
使用 Graphics
中提供的 OnPaintBackground
对象,我的文本看起来很完美。如果我创建自己的 Bitmap
并使用从我的 Graphics
获得的 Bitmap
对象,我的文本看起来很糟糕。看起来它使用黑色来消除文本锯齿,而不是位图的背景色。如果我使用 Graphics.DrawString()
,我可以避免这个问题,但这种方法有可怕的字距调整问题。我应该怎么办?如何使用位图的内容使 TextRenderer.DrawText()
正确抗锯齿?
看起来很糟糕:
Bitmap bmp = new Bitmap(100, 100, PixelFormat.Format32bppArgb);
using (Graphics g = Graphics.FromImage(bmp))
{
g.Clear(Color.Red);
TextFormatFlags tf = TextFormatFlags.Left;
TextRenderer.DrawText(g, @"C:\Development\Testing\blag", font, clip, Color.White,
Color.Transparent, tf);
}
看起来不错,但我想把它渲染到位图上,而不是在控件的表面上:
protected override void OnPaintBackground(PaintEventArgs e)
{
e.Graphics.Clear(Color.Red);
TextFormatFlags tf = TextFormatFlags.Left;
TextRenderer.DrawText(e.Graphics, @"C:\Development\Testing\blag", font, clip,
Color.White, Color.Transparent, tf);
}
有什么区别?
最佳答案
答案是不要使用 TextRenderer
。 TextRenderer 是文本渲染的 GDI(不是 GDI+)实现的包装器,它具有许多功能,但与您发现的内存中 DC 不能很好地互操作。
使用 Graphics.DrawString
和 Graphics.MeasureString
,但记得将它传递给 StringFormat.GenericTypographic 以获得准确的大小和定位。
最初引入 TextRenderer 的原因是 GDI+ 不支持 GDI 的 Uniscribe 引擎支持的所有复杂脚本。然而,随着时间的推移,GDI+ 对复杂脚本的支持得到了扩展,现在已经没有任何充分的理由来使用 TextRenderer(它甚至不再是两者中更快的一个,实际上看起来正好相反)。
不过,真的,除非您遇到严重的、可衡量的性能问题,否则只需使用 Graphics.DrawString
。
关于c# - 位图与OnPaintBackground中的TextRenderer.DrawText,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/849531/