C# GDI+图形程序设计--看书笔记

来源:互联网 发布:网络电视都是带蓝牙么 编辑:程序博客网 时间:2024/05/18 16:37
一、理解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();