一篇文章让你彻底弄懂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初级 ...
随机推荐
- 安卓自动化robotium工具简单使用(二)
在学习安卓的这段时间里,刚好有个朋友有一个APP的应用需要开发. 我马上就动手开始做着试试,在完成开发的同时写了相应的自动化测试代码,使用的是robotium. 才接触安卓没几天,写的不太好,如果有好 ...
- nyoj 题目61 传纸条
传纸条(一) 时间限制:2000 ms | 内存限制:65535 KB 难度:5 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行 ...
- 201621123034 《Java程序设计》第6周学习总结
作业06-接口.内部类 1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 注1:关键词与内容不求多 ...
- 201621123033 《Java程序设计》第9周学习总结
第九次作业 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 //stream(),filter(),collect() ...
- POJ 3974 Palindrome | 马拉车模板
给一个字符串,求最长回文字串有多长 #include<cstdio> #include<algorithm> #include<cstring> #define N ...
- 【CZY选讲·逆序对】
题目描述 LYK最近在研究逆序对. 这个问题是这样的. 一开始LYK有一个2^n长度的数组ai. LYK有Q次操作,每次操作都有一个参数k.表示每连续2^k长度作为一个小组.假设 n=4,k= ...
- 70种简单常用的JS代码
1.后退 前进 <input type="button" value="后退" onClick="history.go(-1)&quo ...
- sql 查找死锁对象的存储过程
USE [master] GO /****** Object: StoredProcedure [dbo].[sp_who_lock] Script Date: 05/12/2016 14:13:46 ...
- 让JavaScript像C#一样支持Region
问题 Web Essentials 是非常给力的js插件,具体的介绍,大家请看这里,最锋利的Visual Studio Web开发工具扩展:Web Essentials详解 . 不过在使用的过程中,让 ...
- OpenGL入门学习(三)
http://developer.178.com/201103/94954704639.html 在第二课中,我们学习了如何绘制几何图形,但大家如果多写几个程序,就会发现其实还是有些郁闷之处.例如:点 ...