GDI绘图
什么是GDI+
GDI+ (Graphics Device Interface) 是一种绘图装置接口, 可将应用程序和绘图硬件分隔, 让我们能够编写与装置无关的应用程序。它可以让我们不需注意特定显示装置的详细数据, 便可在屏幕或打印机显示信息。我们可以呼叫 GDI+ 类别所提供的方法, 然后这些方法会适当地呼叫特定的装置驱动程序, 而完成绘图。而且与.NET进行了更好的融合。
GDI (Graphics Device Interface), 是属于绘图方面的 API (Application Programming Interface)。
因为应用程序不能直接控制硬件, 所以当我们要进行绘图的动作时, 必须透过 GDI 才能完成。
确定坐标系:1.确定原点 2.确定x,y轴和方向
Graphics提供了非常多的绘图的方法可以让我们进行绘制。
绘图方法
Graphics 类别的常用绘图方法有:
DrawLine(直线)、
DrawRectangle (矩形)、
DrawEllipse (椭圆)、
DrawCurve (曲线)、
DarwArc (弧线)、
DrawPie (扇形)、
DrawLines (多边形)、
DrawPolygon (封闭多边形)、
DrawBezier (贝兹曲线)等。
使用GDI绘制简单的图形
//绘制一条直线 private void button1_Click(object sender, EventArgs e) { //创建GDI对象 Graphics g = this.CreateGraphics();// new Graphics(); //创建画笔对象 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 button2_Click(object sender, EventArgs e) { Graphics g = this.CreateGraphics(); Pen pen=new Pen(Brushes.Yellow); Size size=new System.Drawing.Size(80,80); Rectangle rec=new Rectangle(new Point(50,50),size); g.DrawRectangle(pen,rec); } //绘制一个扇形 private void button3_Click(object sender, EventArgs e) { Graphics g = this.CreateGraphics(); Pen pen=new Pen(Brushes.Blue); Size size=new System.Drawing.Size(180,180); Rectangle rec=new Rectangle(new Point(150,150),size); g.DrawPie(pen, rec, 60, 60); } //绘制一个文本 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)); }
//实心画圆
private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { Graphics g=e.Graphics; //定义实心填充画笔 SolidBrush myBrush=new SolidBrush(Color.Yellow); g.FillEllipse(myBrush,50,50,300,200); myBrush.Dispose(); g.Dispose(); }
生成验证码图片实例
1.通过Random生成随机数或字符及验证码
2.通过验证码内容长度生成指定大小的图片
3.获取生成图片的Graphics对象
4.定义验证码字体格式
5.通过指定字体将验证码绘制到图片
6.向图片上添加背景噪音线
7.添加前景噪音点
Random r = new Random(); /// <summary> /// 点击更换验证码 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void pictureBox1_Click(object sender, EventArgs e) { //创建一张图片对象 Bitmap bmp = new Bitmap(120, 20); //存储的就是验证码 string str = string.Empty; for (int i = 0; i < 5; i++) { str += r.Next(0, 10); } //创建GDI+对象 Graphics g = Graphics.FromImage(bmp); string[] fonts = { "微软雅黑", "隶书", "宋体", "黑体", "仿宋" }; Color[] colors = { Color.Black, Color.Yellow, Color.Red, Color.Green, Color.Gold }; //开始绘制验证码 for (int i = 0; i < str.Length; i++) { Point p = new Point(i * 20, 0); g.DrawString(str[i].ToString(), new Font(fonts[r.Next(0, 5)], 15, FontStyle.Bold), new SolidBrush(colors[r.Next(0, 5)]), p); } //给验证码图片中绘制一些直线 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.Pink), p1, p2); } //给验证码添加像素颗粒 for (int i = 0; i < 100; i++) { bmp.SetPixel(r.Next(0, bmp.Width), r.Next(0, bmp.Height), Color.Black); } //把创建的位图对象放在pictureBox上 pictureBox1.Image = bmp; }
神奇的参数
/// <summary>
///
/// </summary>
/// <param name="sender">触发这个事件的对象</param>
/// <param name="e">关于事件的一些数据</param>
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
label1.Text = e.X + "," + e.Y;
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
// e.KeyCode 获取用户按下了哪个键
if (e.KeyCode == Keys.W || e.KeyCode == Keys.Up)
{
MessageBox.Show("前进!!!");
}
else if (e.KeyCode == Keys.S || e.KeyCode == Keys.Down)
{
MessageBox.Show("后退");
}
else if (e.KeyCode == Keys.A || e.KeyCode == Keys.Left)
{
MessageBox.Show("向左");
}
else if (e.KeyCode == Keys.D || e.KeyCode == Keys.Right)
{
MessageBox.Show("向右");
}
}
小坦克移动案例
using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using 小坦克移动.Properties; namespace 小坦克移动 { enum Direction { Up, Down, Left, Right } class Tank { //存储图片 private Image[] imgs = { Resources.p1tankU, Resources.p1tankD, Resources.p1tankL, Resources.p1tankR }; //小坦克的X、Y坐标 public int X { get; set; } public int Y { get; set; } //定义4个方向 public Direction Dir { get; set; } //定义坦克移动的速度 public int Speed { get; set; } //定义坦克的构造函数 public Tank(int x, int y, int speed, Direction dir) { this.X = x; this.Y = y; this.Speed = speed; this.Dir = dir; } //小坦克移动的行为 public void Move() { //根据方向 来判断小坦克要改变的坐标 switch (this.Dir) { case Direction.Up: this.Y -= this.Speed; break; case Direction.Down: this.Y += this.Speed; break; case Direction.Left: this.X -= this.Speed; break; case Direction.Right: this.X += this.Speed; break; } //移动完成后 判断小坦克是否超过了窗体 if (this.X <= 0) { this.X = 0; } if (this.Y <= 0) { this.Y = 0; } if (this.X >= 700-80) { this.X = 620; } if (this.Y >= 600-100) { this.Y = 500; } } public void DrawTank(Graphics g) { switch (this.Dir) { case Direction.Up: g.DrawImage(imgs[0], this.X, this.Y); break; case Direction.Down: g.DrawImage(imgs[1], this.X, this.Y); break; case Direction.Left: g.DrawImage(imgs[2], this.X, this.Y); break; case Direction.Right: g.DrawImage(imgs[3], this.X, this.Y); break; } } public void TankKeyDown(KeyEventArgs e) { if (e.KeyCode == Keys.W || e.KeyCode == Keys.Up) { this.Dir = Direction.Up; } else if (e.KeyCode == Keys.S || e.KeyCode == Keys.Down) { this.Dir = Direction.Down; } else if (e.KeyCode == Keys.A || e.KeyCode == Keys.Left) { this.Dir = Direction.Left; } else if (e.KeyCode == Keys.D || e.KeyCode == Keys.Right) { this.Dir = Direction.Right; } this.Move();//让坦克移动 } } }
public partial class Form1 : Form { public Form1() { InitializeComponent(); } Tank tank; private void Form1_Load(object sender, EventArgs e) { //创建小坦克对象 tank = new Tank(200, 200, 10, Direction.Up); //设置双缓冲 减少屏幕闪烁 this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.Selectable | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.SupportsTransparentBackColor, true); } private void Form1_Paint(object sender, PaintEventArgs e) { //在绘制窗体的时候 将坦克也绘制出来 tank.DrawTank(e.Graphics); } private void Form1_KeyDown(object sender, KeyEventArgs e) { //获取用户按下了哪个键盘 tank.TankKeyDown(e); } private void timer1_Tick(object sender, EventArgs e) { //不停的执行Paint事件 this.Invalidate(); } }