首页 游戏 软件 资讯 排行榜 专题
首页
编程语言
c#如何绘制图形_c#绘制图形的正确用法与注意事项

c#如何绘制图形_c#绘制图形的正确用法与注意事项

热心网友
72
转载
2026-05-05

C#绘图避坑指南:从Graphics来源到DPI适配的实战要点

c#如何绘制图形_c#绘制图形的正确用法与注意事项

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

在C#中进行图形绘制,一个看似简单的DrawRectangle背后,往往藏着好几个“坑”。Graphics对象不能直接new,否则要么直接报错,要么静默失败——所有绘图操作都必须基于合法的来源。这可以说是入门绘图的第一条铁律。

Graphics 从哪来?三个合法入口,别碰 new

直接new Graphics()会抛出NotSupportedException,因为它并非一个可以随意实例化的普通类。合法的来源其实只有三个,各有各的适用场景:

  • 窗体或控件的Paint事件参数:e.Graphics —— 这是最推荐、最标准的方式。它自动参与系统的双缓冲和重绘流程,能确保图形持久且高效。
  • 位图离屏绘制:Graphics.FromImage(bitmap) —— 当你需要生成一张图片文件或在内存中绘制时使用。切记,用完后一定要调用graphics.Dispose()来释放资源。
  • control.CreateGraphics() —— 这个方法的用途比较特殊,通常仅用于调试或实现瞬时覆盖效果(比如鼠标跟随的预览线)。用它绘制的图形不会持久,窗口一旦发生重绘就会消失。

一个典型的错误场景是:在Button_Click事件里调用this.CreateGraphics()画了个矩形,结果按钮一点完,矩形就没了。这其实不是Bug,而是设计如此。

Pen 和 Brush 必须 Dispose,但别乱 new

Pen和Brush这两个类持有底层的GDI+句柄,如果不及时释放,会导致句柄泄漏。长时间运行后,程序可能会莫名其妙地抛出OutOfMemoryException,或者绘图直接失效。

  • 在循环里反复new Pen(Color.Red, 2)是高危操作。正确的做法是使用using语句块:using (var pen = new Pen(...)) { ... }
  • 静态复用是安全的,比如static readonly Pen GridPen = new Pen(Color.LightGray, 1);。但要注意,Pen.WidthColor是只读属性,创建后无法修改。
  • 对于系统预定义的刷子,如Brushes.Red,无需手动Dispose。但如果是自己创建的SolidBrushLinearGradientBrush,就必须手动释放。

DrawRectangle 画不出/位置偏移?先查坐标系和 DPI

明明写了g.DrawRectangle(pen, 10, 10, 100, 50),却什么也看不见,或者画出来的框总往右下角偏。遇到这种情况,大概率是踩了下面三个坑:

  • 没确认目标控件的客户区边界:在PictureBox这类控件上绘图,坐标应该基于pictureBox.ClientSize来计算,而不是硬编码像素值。
  • 高DPI缩放(Win10/11默认开启):此时Graphics.DpiX可能高达120或144。如果还按传统的96DPI设计尺寸去画,图形就会缩放失真。一个简单的校正方法是使用g.ScaleTransform(g.DpiX / 96f, g.DpiY / 96f)
  • 描边与填充的差异DrawRectangle的描边是以边线中心为基准的。如果pen.Width = 3,实际覆盖的区域会比参数指定的宽和高各多出1.5像素。而FillRectangle则是严格按左上角坐标和宽高来填充内部区域。

DrawString 模糊?TextRenderingHint 是关键开关

小字号文字发虚、边缘毛糙,问题通常不在字体本身,而在于默认的文本渲染模式过于“宽松”:

  • 默认的TextRenderingHint.SystemDefault在非整数缩放或ClearType关闭时,极易导致文字模糊。
  • 一个固定的优化写法是:在Paint事件的开头就设置g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
  • 尽量避免使用浮点数的字体大小(如new Font(“Arial”, 9.75f)),.NET会对其进行取整但不作提示。如果对文字精度有极高要求,可以考虑使用GraphicsPath配合FillPath来绘制文字轮廓。

话说回来,真正棘手的是DPI缩放与多显示器混合场景下的坐标对齐问题。这时候,光靠ScaleTransform可能就不够了,往往需要配合Control.LogicalToDeviceUnits方法,或者在应用程序清单中启用Per-Monitor DPI Aware声明——这一点,很多开发者一开始根本想不到。

来源:https://www.php.cn/faq/2332322.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

c#如何绘制图形_c#绘制图形的正确用法与注意事项
编程语言
c#如何绘制图形_c#绘制图形的正确用法与注意事项

C 绘图避坑指南:从Graphics来源到DPI适配的实战要点 在C 中进行图形绘制,一个看似简单的DrawRectangle背后,往往藏着好几个“坑”。Graphics对象不能直接new,否则要么直接报错,要么静默失败——所有绘图操作都必须基于合法的来源。这可以说是入门绘图的第一条铁律。 Grap

热心网友
05.05
VSCode怎么搭建Unity 3D的C#脚本编写环境并解决找不到引用的问题
编程语言
VSCode怎么搭建Unity 3D的C#脚本编写环境并解决找不到引用的问题

VSCode怎么搭建Unity 3D的C 脚本编写环境并解决找不到引用的问题 在Unity开发中,用VSCode写C 脚本时遇到“找不到引用”的红色波浪线,这事儿确实挺让人头疼的。别急,这通常不是代码逻辑问题,而是开发环境之间的“沟通”出了岔子。下面咱们就来逐一拆解最常见的几个原因和对应的解决方案。

热心网友
05.04
C#如何使用Record类型_C#不可变数据模型特性解析【极简】
编程语言
C#如何使用Record类型_C#不可变数据模型特性解析【极简】

C Record类型:不可变数据容器的正确打开方式 先明确一个核心认知:C 中的Record类型,本质上是一个“省心”的不可变数据容器。它不是什么更高级的class,而是编译器帮你自动生成值相等性、ToString、GetHashCode以及with表达式的语法糖。用对了,它能帮你省掉80%的数据

热心网友
05.03
C#如何获取硬件信息_C# WMI读取CPU与硬盘序列号【进阶】
编程语言
C#如何获取硬件信息_C# WMI读取CPU与硬盘序列号【进阶】

WMI无法稳定读取现代CPU与NVMe硬盘序列号?问题不在代码,而在硬件与系统本身 一个常见的开发误区是:用WMI读取CPU和硬盘序列号,结果发现拿不到、拿不准或者拿到一堆乱码。问题往往不在于你的代码写错了,而是系统或固件层面,压根就没把这个“身份证号”暴露给你。 为什么 Win32_Process

热心网友
05.02
C#怎么防止UI线程假死_C#耗时操作放入后台线程更新UI【核心】
编程语言
C#怎么防止UI线程假死_C#耗时操作放入后台线程更新UI【核心】

C 怎么防止UI线程假死_C 耗时操作放入后台线程更新UI【核心】 耗时操作必须离开 UI 线程,否则假死不可避免 —— 这不是优化建议,而是 WinForms WPF 的运行铁律。 为什么直接在 Button_Click 里调用 Thread Sleep 就卡死? 道理其实很简单:UI 线程身兼数

热心网友
05.01

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

小米电视怎么设置小爱唤醒
电脑教程
小米电视怎么设置小爱唤醒

小米电视设置小爱唤醒,只需在系统设置中开启“语音唤醒”功能即可实现远场声控 想让你的小米电视“听话”?其实很简单,核心就是打开系统里的“语音唤醒”开关。具体操作路径非常清晰:从主界面进入“设置”,然后找到“小爱同学”选项,进入后开启“语音唤醒”功能。部分机型的入口可能略有不同,有时需要在“应用”分类

热心网友
05.05
Resolv (RESOLV币) 价格预测2025-2030年:未来能涨到多少?
web3.0
Resolv (RESOLV币) 价格预测2025-2030年:未来能涨到多少?

目录 resolv 是什么? 三代币模型:构建自平衡的经济生态 今天、明天和未来 30 天的价格预测 Resolv (RESOLV) 价格预测 2025-2030 Resolv(RESOLV)2025年每月价格预测 Resolv (RESOLV) 2026 年价格预测 Resolv (RESOLV)

热心网友
05.05
啪嗒砰1 2REPLAY怎么购买
游戏攻略
啪嗒砰1 2REPLAY怎么购买

啪嗒砰1 2replay购买指南:重温经典节奏之旅 在众多独具创意的游戏系列中,啪嗒砰以其将节奏与策略完美融合的玩法,始终占据着特殊的一席之地。对于希望重温这份经典乐趣的玩家而言,《啪嗒砰1 2replay》无疑是最佳选择。那么,如何才能顺利地将它收入囊中呢?这份详尽的购买指南将为你梳理清楚每一个关

热心网友
05.05
怎么获取《红色沙漠》中的风信子金刚鹦鹉宠物
游戏攻略
怎么获取《红色沙漠》中的风信子金刚鹦鹉宠物

《红色沙漠》的最新更新带来了不少惊喜,可重复挑战的Boss战、伪装商店,还有几只可以收为宠物的传奇动物。两只传奇鸟类里,机械风格的“铁鹰”固然拉风,但如果你偏爱更可爱、体型更小巧的伙伴,那“风信子金刚鹦鹉”值得你花点心思。 不过,想让它乖乖跟你走,得先完成几个步骤。下面就是《红色沙漠》中收服风信子金

热心网友
05.05
狂徒贼在每周平衡性调整中再次获得加强
游戏攻略
狂徒贼在每周平衡性调整中再次获得加强

狂徒贼补偿增益提升至9%!暴雪修正12 0 5版本诡诈者天赋削弱,确保强度持平 了解最新职业平衡调整详情。 暴雪在5月5日的周常维护后,更新了职业平衡调整说明,其中一项关键改动是提高了对狂徒盗贼的补偿性增益幅度。事情的起因,还得从12 0 5版本补丁说起。在那个补丁中,诡诈者英雄天赋“云层覆盖”经过

热心网友
05.05