一、理解GDI+
GDI+是一个库,它提供了一个接口,此接口允许程序员编写与打印机、监视器或文件等图形设备进行交互的windows和web图形应用程序。其实是由C++编写的一个类,供我们调用。在程序中使用GDI+需要添加相应的命名空间,主要由
System.Drawing:基本的GDI+功能的定义,它提供了Graphics类,这个类提供了最重要的绘图与填充方法。还封装了矩形,点,画笔和钢笔等GDI图元类。
System.Drawing.Drawing2D名称空间。高级二维和矢量图形应用程序的功能。
System.Drawing.Imaging:基本图像处理功能.
二、GDI+基本应用
首先要绘图,要有绘图的画布,画布可以是窗体表面,打印机表面,位图表面,还要有画笔,可以是钢笔,笔刷等。还要有一个画图的过程即方法调用。另外还需要知道坐标系统,在窗体表面,坐标是以左上角为(0,0)。
现在开始进行基本画图操作
1、获取一个Graphics对象
可以通过窗体的paint事件获取
private void form1_Paint(object sender,PaintEventArgs e)
{
Graphics g=e.Graphics;
} 重载OnPaint
protected override void OnPaint(PaintEventArgs e)
{
Graphics g=e.Graphics;
}以上两种方法都是在窗体加载时就得到的,但我们常常需要在别的时候得到并绘图,所以要使用其它方法。
Graphics g=this.CreateGraphics();//通过窗体本身方法
Bitmp bmp=new (600,400);
Graphics g=Graphics.FromImage(bmp)//通过图形得到一个
Graphics g=Graphics.FromHwnd(this.Handle)//通过窗体句柄得到一个。通过图形得到一个,那么我们可以在图形上绘制图形,我觉得这是我们比较常用的方法。
有了Graphics对象,我们可以通过这个类的方法进行绘制各种基本图形。但还需要钢笔或画笔才能绘制。
2、创建钢笔或画笔
Pen redPen=new Pen(Color.Red,3)//创建一个红色,宽为3象素的钢笔
Pen blackPen=Pens.Black //创建一个黑色钢笔
SolidBrush greenBrush=new SolidBrush(Color.Green)//创建一个绿色的画笔有了画笔或钢笔我们就可以画画了
3、绘制图形
Bitmap bmp = new Bitmap(this.Width, this.Height);
Graphics g = Graphics.FromImage(bmp);
g.Clear(Color.White);//设画布背景为白色
g.SmoothingMode = SmoothingMode.AntiAlias;//质量为消除齿
Rectangle rect = new Rectangle(20, 20, 100, 100);//创建一个矩形
Pen redPen = new Pen(Color.Red, 3);
Pen blackPen = Pens.Black;
SolidBrush greenBrush = new SolidBrush(Color.Green);
g.DrawRectangle(redPen, rect);//通过钢笔画矩形
g.FillEllipse(greenBrush, rect);//用画笔填充矩形
g.DrawLine(blackPen, 0, 250, this.Width, 250);//画线
g.FillEllipse(Brushes.Blue, 70, 220, 30, 30);//填充圆
g.FillEllipse(Brushes.SkyBlue, 100, 210, 40, 40);
g.FillEllipse(Brushes.Green, 140, 200, 50, 50);
e.Graphics.DrawImage(bmp, 0.0F, 0.0F);//把图形画到窗体上
greenBrush.Dispose();//清除资源
redPen.Dispose();
g.Dispose();
这是最基本的GDI+画图方法,其实也就是得到一个画布,画笔(Pen,SolidBrush),画图方法(Graphics.方法).这是画图三要素。
下面加个实例,是我转过来的,本来想写出一个图表控件,但有点小问题,我现在把这个例子粘出来,希望有人能做出这个控件
Bitmap bm = new Bitmap(240, 210);
//在新建的画布上画一个图
Graphics bp = Graphics.FromImage(bm);
//设置bp的背景色为Beige
bp.Clear(Color.Beige);
//创建数据源,在此为一个数组
int[] a1 ={ 20, 40, 60, 80, 100, 120, 140, 160 };
int[] a2 ={ 40, 60, 80, 100, 120, 140, 160, 180 };
bp.DrawRectangle(Pens.Black, 1, 1, 230, 205);
//通过循环画出柱状图
for (int i = 0; i < a1.Length; i++)
{
//填充图(着色,起点X,起点Y,宽,高)
bp.FillRectangle(new SolidBrush(Color.Blue), (i * 30) + 5, 200 - a1[i], 5, a1[i] + 5);
//填充边框(着色,起点X,起点Y,宽,高)
bp.DrawRectangle(Pens.Black, (i * 30) + 5, 200 - a1[i], 5, a1[i] + 5);
}
//柱图2
for (int i = 0; i < a2.Length; i++)
{
bp.FillRectangle(new SolidBrush(Color.Red), (i * 30) + 10, 200 - a2[i], 5, a2[i] + 5);
bp.DrawRectangle(Pens.Black, (i * 30) + 10, 200 - a2[i], 5, a2[i] + 5);
}
Graphics gg = this.CreateGraphics();
gg.DrawImage(bm, 0.0f, 0.0f);
gg.Dispose();
bp.Dispose();