GDI+ ——下一代图形设备接口
所有的图形用户界面(GUI)应用程序都与硬件设备(显示器,打印机,扫描仪)进行交互,这可以表示为可读的数据。不过应用程序并不直接和设备之间进行通信,否则必须为每台设备分别编写不同的用户接口代码。为了避免这种重复的工作,我们可以在应用程序和设备之间使用第三个组件,此组件将转换和传送发送到设备的数据,以及设备发送到程序的数据。而这个组件就是GDI+。 GDI+是.NET Framework中与图形设备进行交互的入口。 GDI+是一组C++类,位于一个名为Gdiplus.dll的类库中。 Gdiplus.dll是Windows XP和Windows Server 2003操作系统中一个内置组件。好了,学术性的东西在这里就不多废唇舌了,下面我们用GDI+在Web Form中来画一幅图。
像类似这样的图想必大家都见过,当然这个图并不标准,这里把代码贴出来有兴趣的可以试一试!
namespace Sky_MsdnDataGrid
{
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
/// <summary>
/// AspxChart 的摘要描述。
/// </summary>
public class AspxChart : System.Web.UI.Page
{
private Bitmap bitmap;
private Graphics graphics;
private int[] arrValues;
private string[] arrValueNames;
private void Page_Load(object sender, System.EventArgs e)
{
arrValues = new int[6];
arrValueNames = new string[6];
arrValues[0] = 100;
arrValues[1] = 135;
arrValues[2] = 115;
arrValues[3] = 125;
arrValues[4] = 75;
arrValues[5] = 120;
arrValueNames[0] = "一月";
arrValueNames[1] = "二月";
arrValueNames[2] = "三月";
arrValueNames[3] = "四月";
arrValueNames[4] = "五月";
arrValueNames[5] = "六月";
this.Init_Bitmap();
this.Draw_Rectangle();
this.Draw_Pie();
// 将绘制的图像以Gif 的格式保存到当前页面响应的输出流中
bitmap.Save(this.Response.OutputStream,ImageFormat.Gif);
}
/// <summary>
/// 对即将要被绘制的位图(可想象为一块画布)进行初始动作
/// </summary>
private void Init_Bitmap()
{
bitmap = new Bitmap(400,200);
graphics = Graphics.FromImage(bitmap);
graphics.Clear(Color.White);
graphics.DrawString("X 公司上半年销售情况",new Font("新细明体",16,FontStyle.Underline),Brushes.Black,new PointF(5,5));
}
#region Web Form 设计工具产生的程式码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 此为ASP.NET Web Form 设计工具所需的呼叫。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 此为设计工具支援所必须的方法- 请勿使用程式码编辑器修改
/// 这个方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
/// <summary>
/// 在画布上面绘制矩形
/// </summary>
private void Draw_Rectangle()
{
int i;
PointF symbolLeg = new PointF(335,20);
PointF descLeg = new PointF(360,16);
for (i = 0; i < arrValueNames.Length; i++)
{
graphics.FillRectangle(new SolidBrush(GetColor(i)),symbolLeg.X,symbolLeg.Y,20,10);
graphics.DrawRectangle(Pens.Black,symbolLeg.X,symbolLeg.Y,20,10);
graphics.DrawString(arrValueNames[i].ToString(),new Font("新细明体",8),Brushes.Black,descLeg);
symbolLeg.Y += 15;
descLeg.Y += 16;
}
for (i = 0; i < arrValues.Length; i++)
{
graphics.FillRectangle(new SolidBrush(GetColor(i)),(i*35) + 15,200 - arrValues[i],20,arrValues[i]);
graphics.DrawRectangle(Pens.Black,(i*35) + 15,200 - arrValues[i],20,arrValues[i]);
}
}
/// <summary>
/// 在画布上面绘制圆饼形
/// </summary>
private void Draw_Pie()
{
int i;
// currentangle代表当前角度totalangle代表最大角度totalvalues代表最大的销售额
float sglCurrentAngle = 0,sglTotalAngle = 0,sglTotalValues = 0;
// 计算最大销售额
for (i = 0; i < arrValues.Length; i++)
sglTotalValues += arrValues[i];
for (i = 0; i < arrValues.Length; i++)
{
// 当月角度值 : 当月销售额 / 最大销售额 * 360
sglCurrentAngle = arrValues[i] / sglTotalValues * 360;
graphics.FillPie(new SolidBrush(GetColor(i)),240,95,100,100,sglTotalAngle,sglCurrentAngle);
graphics.DrawPie(Pens.Black,240,95,100,100,sglTotalAngle,sglCurrentAngle);
sglTotalAngle += sglCurrentAngle;
}
}
#region Helper Function
private Color GetColor(int itemIndex)
{
Color color;
switch(itemIndex)
{
case 0:
color = Color.Blue;
break;
case 1:
color = Color.Red;
break;
case 2:
color = Color.Yellow;
break;
case 3:
color = Color.Purple;
break;
case 4:
color = Color.Orange;
break;
case 5:
color = Color.Brown;
break;
default:
color = Color.Blue;
break;
}
return color;
}
#endregion
}
}