在C#开发中,文字绘制看似简单,但要想让文字在各种场景下都清晰、准确、稳定地显示,其实是门技术活。不少开发者都遇到过这样的场景:明明代码写得没什么问题,可文字显示出来就是模糊、位置不对,甚至干脆乱码。今天就来聊聊几个常见的“坑”和对应的解决方案,希望能帮你少走弯路。

c#如何绘制文字_c#绘制文字看这一篇就够了

Graphics.DrawString 画出来的文字模糊或缩放失真

直接使用 Graphics.DrawString 在窗体或控件上绘图时,如果目标 Graphics 来自缩放后的设备上下文(比如高 DPI 显示器、窗体被放大、或通过 Bitmap 缩放后获取的 Graphics),文字很容易出现锯齿、发虚、边缘毛刺。这通常不是字体本身的问题,而是默认未启用高质量文本渲染。

问题出在默认的渲染设置上,我们需要手动指示它“认真对待”文字渲染。具体做法是显式设置文本渲染提示和插值模式:

MeasureString 返回宽度不准,导致文字截断或布局错位

Graphics.MeasureString 也是一个经典“坑”。它返回的尺寸包含额外空白(如行距、左右留白),而且受 StringFormat 和当前 GraphicsPageUnitDpiX 影响,并不等于实际绘制区域所需的空间。这就导致依赖它计算布局时,文字可能被截断或位置偏移。

更可靠的方式是改用 TextRenderer.MeasureText(WinForms 场景)或 Graphics.MeasureCharacterRanges(需要精确到字符区间时):

在 WPF 或 .NET MAUI 中混用 System.Drawing 绘制文字

WPF 原生用 FormattedText / DrawText,MAUI 用 CanvasSKCanvas(SkiaSharp)。强行在 WriteableBitmapSKSurface 上桥接 System.Drawing.Graphics 会导致性能暴跌甚至崩溃——因为 System.Drawing 是 GDI 封装,与 GPU 渲染管线根本不在一个赛道上。

正确的做法是直接放弃对 Graphics 的依赖,转用平台亲生的文本绘制方案:

中文乱码或字体 fallback 失败

在非中文系统(如英文 Windows)上调用 DrawString 显示中文,即使指定了 "SimSun""Microsoft YaHei",仍可能回退到方块或空格——因为 Graphics 默认使用系统 UI 字体族 fallback,而 Font 构造函数指定的字体名只是“首选”,并不强制生效。

问题出在几个关键环节上:

字体不是“设了就显示”,它是运行时资源绑定过程。出问题时先查 FontFamily.IsA vailable 和系统实际安装路径,别只盯着 DrawString 参数。

本文转载于:https://www.php.cn/faq/2317089.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。