1、什么是GDIGDIGraphics Device Interface是一种绘图装置接口可将应用程序和绘图硬件分割让我们能够编写与装置无关的应用程序它可以让我们不需要注意特定显示装置的详细数据便可在屏幕或打印机显示信息。我们可以呼叫GDI类别所提供的方法然后这些方法会适当地呼叫特定装置的驱动程序而完成绘图。而且与.NET进行了更好的融合。2、坐标系统在GDI中所采用的坐标系统与平时人们较常用的坐标系系统不同主要差在于一般的二维坐标系x轴与y轴分别是往右往上递增如左图而GDI所采用的坐标系x轴和y轴则是往右往下递增如右图。3、Windows窗体与GDI所有的Windows打开的弹窗都是由GDI画出来的所以相对于一些很老式的电脑将窗体拖动至屏幕边缘先“裁剪”掉一部分然后再将整个窗体拉回完整显示状态由于老旧设备的硬件性能不足可能导致拖影现象。实际上重新将已经抹除部分的窗体拉回到完整状态系统在不断的进行窗体的“抹除”与“重绘”的动作下面我将详细演示一下这个变化过程。如下图是我打开的一个Windows窗体。第一步首先绘制一条线这里我们只展示效果具体代码见“GDI实战”部分。第二步我们将窗体拖动至屏幕边缘并且使其被裁剪部分。第三步拖回窗体我们可以发现直线被裁剪了部分这是因为Form1进行了重新绘制但是直线没有被重新绘制。想要解决这一方法也十分简单。我们只需要在窗体--属性--事件将“绘制直线”的逻辑写到Paint事件里面即可这样绘制窗体的时候也会一并重新绘制直线了。详情见4.1 GDI示例代码部分4、GDI示例下面我们来具体做几个示例来体验一下。4.1 代码部分1、我加上了一个绘画次数统计功能这样一旦GDI进行绘制我们都可以知道实时的绘画状态与统计数据了。2、拿画直线来说需要一根笔Pen对象颜色、一张纸Form窗体、两个点Point对象。3、GDI对象无法用new创建我们需要使用this.CreateGraphics();using System.Diagnostics; namespace GDI { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // 一根笔 颜色 一张纸 两个点 绘制直线的对象 } /// summary /// 画直线 /// /summary /// param namesender/param /// param namee/param private void button1_Click(object sender, EventArgs e) { // 创建GDI对象无法new给窗体创建 Graphics g this.CreateGraphics(); // 创建画笔 Pen pen new Pen(Brushes.Red); // 创建两个点 Point p1 new Point(30, 50); Point p2 new Point(250, 250); g.DrawLine(pen, p1, p2); } private void label1_Click(object sender, EventArgs e) { } int i 0; /// summary /// 记录绘制次数 /// /summary /// param namesender/param /// param namee/param private void Form1_Paint(object sender, PaintEventArgs e) { i; label1.Text 绘制次数 i.ToString(); // 创建GDI对象无法new给窗体创建 Graphics g this.CreateGraphics(); // 创建画笔 Pen pen new Pen(Brushes.Red); // 创建两个点 Point p1 new Point(30, 50); Point p2 new Point(250, 250); g.DrawLine(pen, p1, p2); } /// summary /// 画矩形 /// /summary /// param namesender/param /// param namee/param private void button2_Click(object sender, EventArgs e) { // 创建GDI对象 Graphics g this.CreateGraphics(); // 创建笔 Pen pen new Pen(Brushes.Green); // 创建Size对象 Size size new System.Drawing.Size(80, 80); // 画矩形 Rectangle rec new Rectangle(new Point(150, 50), size); g.DrawRectangle(pen, rec); } /// summary /// 画扇形 /// /summary /// param namesender/param /// param namee/param private void button3_Click(object sender, EventArgs e) { // 创建GDI对象 Graphics g this.CreateGraphics(); // 创建笔 Pen pen new Pen(Brushes.Blue); // 创建Size对象 Size size new System.Drawing.Size(180, 180); // 画扇形 Rectangle rec new Rectangle(new Point(300, 50), size); g.DrawPie(pen, rec, 60, 60); } /// summary /// 画文本 /// /summary /// param namesender/param /// param namee/param private void button4_Click(object sender, EventArgs e) { Graphics g this.CreateGraphics(); g.DrawString(唯有忍耐到底的必然得救, new Font(宋体, 20,FontStyle.Underline),Brushes.Black, new Point(300,300)); } } }4.2 运行效果5、验证码生成器项目5.1 代码部分1、第一步创建项目添加PictureBox控件2、第二步生成随机数使用Random3、第三步画随机数。此处当然你也可以自定义一个字体数组随机取哟由于小编电脑缺失相关字体这里统一使用了宋体4、第四步为验证码添加一些视觉干扰。注意此处的坐标取值注意不要超出Bitmap的面积范围5、第五步将验证码图片镶嵌到PictureBox控件上。namespace YZM { public partial class Form1 : Form { public Form1() { InitializeComponent(); this.Text 验证码生成器; } private void pictureBox1_Click(object sender, EventArgs e) { // 1. 产生随机数 Random r new Random(); string str null; for (int i 0; i 5; i) { int rNum r.Next(0, 10); str rNum; } //MessageBox.Show(str); // 2. 画随机数 Bitmap bmp new Bitmap(120, 40); Graphics g Graphics.FromImage(bmp); for (int i 0; i 5; i) { Point p new Point(i * 20, 0); Color[] colors { Color.Yellow, Color.Blue, Color.Black, Color.Red, Color.Green }; g.DrawString(str[i].ToString(), new Font(宋体, 15, FontStyle.Bold),new SolidBrush(colors[r.Next(0,5)]),p); // 取随机颜色我们使用SolidBrush单色刷去实现 } // 3.添加干扰线 for (int i 0; i 20; i) { Point p1 new Point(r.Next(0,bmp.Width),r.Next(0,bmp.Height)); Point p2 new Point(r.Next(0,bmp.Width),r.Next(0,bmp.Height)); g.DrawLine(new Pen(Brushes.Green), p1, p2); } // 4.添加干扰点 for (int i 0; i 500; i) { Point p new Point(r.Next(0, bmp.Width), r.Next(0, bmp.Height)); bmp.SetPixel(p.X,p.Y, Color.Black); } // 5.将图片镶嵌到pictureBox中 pictureBox1.Image bmp; } } }5.2 运行效果好了今天的学习就到这里。不积跬步无以至千里不积小流无以成江海。内在的强大才是真正的强大成功不会辜负每一个追赶星光的人让我们一起进步。