C# GDI+绘图方法 C#如何实现图形绘制
发布时间 - 2026-02-03 00:00:00 点击率:次Graphics对象只能从Control.CreateGraphics()、OnPaint事件的e.Graphics或Graphics.FromImage(bitmap)获取,不可直接new;需注意坐标系、抗锯齿、资源释放及双缓冲启用。
Graphics 对象从哪来:别直接 new
直接调用 new Graphics() 会抛出 NotSupportedException——Graphics 不是普通类,它必须绑定到一个有效的绘图表面。常见合法来源只有三个:Control.CreateGraphics()、重写 OnPaint 中的 e.Graphics、或从 Bitmap 创建。
-
Control.CreateGraphics()返回的Graphics是临时的,不参与双缓冲,窗口重绘时内容会丢失;仅适合调试或一次性绘制 - 真正稳定的绘图入口是重写控件的
OnPaint方法,使用参数PaintEventArgs e中的e.Graphics - 离屏绘制(如生成图片)要用
Graphics.FromImage(bitmap),记得之后调用graphics.Dispose()
DrawLine 和 FillRectangle 的坐标系陷阱
GDI+ 默认以控件左上角为原点 (0, 0),X 向右递增,Y 向下递增——这和数学坐标系相反,但和 Windows 窗口坐标一致。容易出错的是:线条宽度影响实际绘制范围,且 FillRectangle 填充的是「内部」,而 DrawRectangle 描边是以边线中心为基准。
-
DrawLine(pen, 0, 0, 100, 100):线段起点在 (0,0),终点在 (100,100),但若pen.Width = 3,实际像素会覆盖从 y=−1 到 y=+2 的区域 -
FillRectangle(brush, 10, 10, 50, 30):填充区域为 x∈[10,6
0), y∈[10,40) —— 宽高是「内尺寸」,不包含右/下边界像素
- 抗锯齿开关:用
graphics.SmoothingMode = SmoothingMode.AntiAlias可柔化斜线和圆弧,但会轻微降低性能
Pen 和 Brush 必须手动释放
Pen 和 Brush 类型都实现了 IDisposable,内部持有 GDI 句柄。不释放会导致句柄泄漏,程序运行一段时间后可能抛出 OutOfMemoryException 或绘图失败。
- 避免在循环中反复
new SolidBrush(Color.Red);应复用或用using包裹 - 系统预定义画刷(如
Brushes.Red)是静态只读对象,不用释放;但自定义new LinearGradientBrush(...)必须Dispose() - 典型安全写法:
using (var pen = new Pen(Color.Blue, 2f)) { g.DrawLine(pen, 0, 0, 100, 100); }
双缓冲没开?闪烁就是它
在 OnPaint 中直接绘图却没启用双缓冲,控件在重绘时会出现明显闪烁,尤其当背景清空和图形绘制分两步进行时。
- WinForms 中最简单开启方式:
this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true),建议在构造函数末尾调用 - 不要手动调用
g.Clear(Color.White)再画内容——Clear 本身就会触发一次屏幕刷新;应让背景绘制和前景绘制在同一个缓冲区完成 - 若使用
CreateGraphics(),双缓冲对其无效,因为它绕过了控件的绘制管道
Dispose 的 Pen,可能让程序跑半天才崩;一次没走 OnPaint 的 CreateGraphics,会让动画看起来像幻灯片。
# windows
# ai
# win
# c#
# 重绘
# red
# 构造函数
# 循环
# using
# 对象
# 事件
# this
# 的是
# 句柄
# 重写
# 抛出
# 步进
# 就会
# 抗锯齿
# 而在
# 半天
# 对其
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
浅谈javascript alert和confirm的美化
Swift中swift中的switch 语句
Claude怎样写约束型提示词_Claude约束提示词写法【教程】
Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决
Linux系统命令中tree命令详解
如何在企业微信快速生成手机电脑官网?
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
如何快速搭建FTP站点实现文件共享?
Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优
javascript中对象的定义、使用以及对象和原型链操作小结
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
简历没回改:利用AI润色让你的文字更专业
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集
如何在云指建站中生成FTP站点?
Bootstrap CSS布局之列表
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
网站制作免费,什么网站能看正片电影?
laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法
如何在IIS中新建站点并配置端口与IP地址?
如何在局域网内绑定自建网站域名?
如何自定义建站之星模板颜色并下载新样式?
Laravel如何配置和使用缓存?(Redis代码示例)
详解jQuery中基本的动画方法
iOS验证手机号的正则表达式
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
javascript如何操作浏览器历史记录_怎样实现无刷新导航
详解阿里云nginx服务器多站点的配置
如何在IIS7中新建站点?详细步骤解析
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
使用Dockerfile构建java web环境
个人网站制作流程图片大全,个人网站如何注销?
打造顶配客厅影院,这份100寸电视推荐名单请查收
详解MySQL数据库的安装与密码配置
如何在IIS中新建站点并解决端口绑定冲突?
浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】
独立制作一个网站多少钱,建立网站需要花多少钱?
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
Laravel如何使用Livewire构建动态组件?(入门代码)
Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道
如何在Windows 2008云服务器安全搭建网站?


