一篇文章让你彻底弄懂WinForm GDI 编程基本原理
一 GDI编程原理
GDI(Graphics Device Interface,图形设备接口),主要负责Windows系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出。
GDI的常用对象有Graphics、Pen、Font、Brush等。
在GDI的所有类中,Graphics类是核心,在绘制任何图形之前,一定要先创建或得到一个Graphics类的对象。
那么什么是Graphics呢?
可以将Graphics对象理解成一个画图环境,这个画图环境包括:要画在什么东西上,用什么画(什么颜色,类型的画笔,画刷),怎么画(画圆形还是方形等等)。
二 两种得到Graphics对象的主要方法
1.使用窗体或控件的CreateGraphics方法,无论是Form还是button,textbox等控件均可调用,用哪个对象调用的就表明要画在哪个对象上。

button1的事件处理函数中:
Graphics g = this.CreateGraphics(); //画一个椭圆 g.DrawEllipse(Pens.Red, 100,100, 50, 50);// g.Dispose();
注意这里
g = this.CreateGraphics();
this代表的是form窗体本身,所以表明现在要在form上进行作图,(100,100)是相对于form窗体左上角点的偏移。所以结果看到的就是左上边那个圆形。
button2的事件处理函数中:
Graphics g = this.button2.CreateGraphics(); //画一个椭圆 g.DrawEllipse(Pens.Red, 50, 50, 50, 50); g.Dispose();
和上面button1唯一不同的地方在于Graphics对象的获取办法:
Graphics g = this.button2.CreateGraphics();
注意,这回我们是用button2对象调用的CreateGraphics()方法,表明现在要在button2上进行作图,(100,100)是相对于button2控件左上角点的偏移。所以结果看到的就是右边的那个圆形。
此时,注意如果将该窗体最小化再最大化或者将窗体拖动到屏幕的外面,我们发现2个小圆形,消失了。这里是因为每当发生以上行为的时候,windows会自动触发窗体的重绘操作,窗体重绘后,我们刚刚画的小圆形就消失了。
2.由此可以引出我们得到Graphics对象的第二种办法---窗体或控件的OnPaint函数。
窗体或控件的Paint事件是最常用于放置绘图代码的地方,每当窗体被其他窗体挡住,再次显示的时候,窗体的所有内容必须被重绘,
窗体或控件的OnPaint函数会被windows操作系统自动调用,button2_Paint(object sender, PaintEventArgs e)
在Paint函数中,有一个PaintEventArgs e参数,通过e.Graphics,我们可以得到该窗体或控件的Graphics对象,之后的画图操作就和第一种方式相同了。
如果我们将绘图代码放到了xxx_Paint函数中,就不会发生当窗体被其他窗体挡住,再次显示的时候,之前画的图形都消失了的情形了,因为这些图形被再次重绘了。
另外,需要额外说明的是,除了用户操作(比如最小化再最大化窗体)可以触发xxx_Paint函数之外,程序中可以通过调用窗体或控件的Refresh()方法主动触发窗体或控件的重绘。
三 示例代码下载
作者:宋波
出处:http://www.cnblogs.com/ice-river/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我!
出处:http://www.cnblogs.com/ice-river/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我!
分类:
高效掌握C#(初级)
标签:
GDI编程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?