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

Graphics g = this.CreateGraphics(); //画一个椭圆 g.DrawEllipse(Pens.Red, ,, , );// g.Dispose();
注意这里
g = this.CreateGraphics(); this代表的是form窗体本身,所以表明现在要在form上进行作图,(100,100)是相对于form窗体左上角点的偏移。所以结果看到的就是左上边那个圆形。
Graphics g = this.button2.CreateGraphics(); //画一个椭圆 g.DrawEllipse(Pens.Red, , , , ); 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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我!
一篇文章让你彻底弄懂WinForm GDI 编程基本原理的更多相关文章
- 一篇文章让你彻底弄懂SSL/TLS协议
目录 SSL/TLS的应用 TLS协议的架构 握手协议 主密码和预备主密码 TLS记录协议 一篇文章让你彻底弄懂SSL/TLS协议 SSL/TLS是一种密码通信框架,他是世界上使用最广泛的密码通信方法 ...
- 什么。你还没有搞懂Spring事务增强器 ,一篇文章让你彻底搞懂Spring事务,虽然很长但是干货满满
上一篇文章主要讲解了事务的Advisor是如何注册进Spring容器的,也讲解了Spring是如何将有配置事务的类配置上事务的,也讲解了Advisor,pointcut验证流程:但是还未提到的那个Ad ...
- WinForm GDI编程:Graphics画布类
命名空间: using System.Drawing;//提供对GDI+基本图形功能的访问 using System.Drawing.Drawing2D;//提供高级的二维和矢量图像功能 using ...
- 一文弄懂-Netty核心功能及线程模型
目录 一. Netty是什么? 二. Netty 的使用场景 三. Netty通讯示例 1. Netty的maven依赖 2. 服务端代码 3. 客户端代码 四. Netty线程模型 五. Netty ...
- 一文弄懂-《Scalable IO In Java》
目录 一. <Scalable IO In Java> 是什么? 二. IO架构的演变历程 1. Classic Service Designs 经典服务模型 2. Event-drive ...
- 一篇文章彻底弄懂Android-MVVM
转: 一篇文章彻底弄懂Android-MVVM 在学习一个技术之前,我们首先要搞清为什么要用它.用它以后会有什么好处,这样我们才能有兴趣的学习下去. 一.为什么要用MVVM? 我为什么要用这个什么MV ...
- 一篇文章弄懂 Java 反射的使用
说到Java反射,必须先把 Java 的字节码搞明白了,也就是 Class , 大 Class 在之前的文章中,我们知道了Java的大Class就是类的字节码,就是一个普通的类,里面保存的是类的信息, ...
- 一篇文章看懂JS闭包,都要2020年了,你怎么能还不懂闭包?
壹 ❀ 引 我觉得每一位JavaScript工作者都无法避免与闭包打交道,就算在实际开发中不使用但面试中被问及也是常态了.就我而言对于闭包的理解仅止步于一些概念,看到相关代码我知道这是个闭包,但闭包 ...
- 一篇文章一张思维导图看懂Android学习最佳路线
一篇文章一张思维导图看懂Android学习最佳路线 先上一张android开发知识点学习路线图思维导图 Android学习路线从4个阶段来对Android的学习过程做一个全面的分析:Android初级 ...
随机推荐
- 第一次玩博客 感觉自己特别low
第一天来 来好激动第一天来 来好激动第一天来 来好激动第一天来 来好激动第一天来 来好激动第一天来 来好激动第一天来 来好激动第一天来 来好激动第一天来 来好激动第一天来 来好激动 ...
- git使用及一些配置、问题
安装https://git-for-windows.github.io/ 一.绑定用户名.邮件地址 git config --global user.name "Your Name" ...
- Java 中xml解析
1.String 字符串保持到txt文件 String xml ="abcdefghijk"; FileWriter fw = null; File f = new File(&q ...
- PHP 自制分页类
思路: 通过给页面url传递get参数,来控制每页的sql查询(mysql关键词:limit),实现分页查询 代码: class getpage{ public $pagenum; public $p ...
- 用canvas实现鼠标拖动绘制矩形框
需要用到jCanvas插件和jQuery. jCanvas下载:https://raw.githubusercontent.com/caleb531/jcanvas/master/jcanvas.mi ...
- 【HDU 3336 Count the string】
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- Computer(hdu 2196)
题意:给出一棵树,求出每个点与距离它最远的点的距离. /* 树形DP 先把无根树转为有根树,对于一个节点i来说,与它相距最远的点有两种可能,一是在它的子树中,二是不在,我们分别用f[i][0]和f[i ...
- 将GDB中的输出定向到文件
1 set args >output.log 三种方法,一种通过tee在启动时重定向: 1 gdb |tee -a file 第二种在run时加入: 1 run <input.txt &g ...
- 小Z爱划水(NOIP信(sang)心(bin)赛)From FallDream
题目: 小Z在机房.他和其它机房同学都面临一个艰难的抉择,那就是 要不要划水? 每个人都有自己的一个意见,有的人想做题,有的人想划水. 当然,每个人只能选择一个事情做.如果一个人做的事情和他想做的不同 ...
- error LNK2026: 模块对于 SAFESEH 映像是不安全的(转)
原文转自 http://www.cnblogs.com/hanxi/archive/2012/06/10/2544230.html 今天使用VS2012遇到一个问题:"链接器工具错误 LNK ...