99网
您的当前位置:首页绘图程序代码,用C#实现

绘图程序代码,用C#实现

来源:99网
 一个很好的绘图程序代码,用C#实现。

using System;

using System.IO;//用于文件存取 using System.Data;//用于数据访问

using System.Drawing;//提供画GDI+图形的基本功能

using System.Drawing.Text;//提供画GDI+图形的高级功能

using System.Drawing.Drawing2D;//提供画高级二维,矢量图形功能 using System.Drawing.Imaging;//提供画GDI+图形的高级功能

namespace Drawpicture {

///

/// BarChart 的摘要说明。 ///

public class BarChart {

private int Pic_Width = 410; private int Pic_Height = 320;

public static bool hasNeg = false; private const string FontWord = \\\"Arial\\\"; private const int FontSize = 9; public int SIDE_WIDTH = 400; public int SIDE_HEIGHT = 400; private const int CHART_TOP = 60; private int CHART_HEIGHT = 300; private const int CHART_LEFT = 60;

private const int CHART_WIDTH = 300;

public void Render(string[] word,int[] data, out string fileName) {

for(int i=0;iif(data[i]<0) {

Pic_Height *=2; hasNeg = true;

SIDE_HEIGHT = (int)(SIDE_HEIGHT*1.5); CHART_HEIGHT =(int)(CHART_HEIGHT*0.3); break; }

}

ChartUtil cu = new ChartUtil(); PointF[] zuoBiaoStart;

PointF[] zuoBiaoEnd;

Graphics g; [Page] Bitmap bm;

createCanvas(out bm, out g, out zuoBiaoEnd, out zuoBiaoStart,cu); //画坐标轴

int chiDu = drawAxes(data, zuoBiaoStart, g, zuoBiaoEnd,cu); //画条形图

float barWidth = CHART_WIDTH / (2 * 2);

PointF barOrigin = new PointF(CHART_LEFT + (barWidth / 2),0); float barHeight = 2; for(int i=0;i<2;i++) {

barHeight = ((float)data[i]/chiDu) *(CHART_HEIGHT/5) ; if(barHeight<0)

{

barOrigin.Y = CHART_TOP + CHART_HEIGHT; } else {

barOrigin.Y = CHART_TOP + CHART_HEIGHT - barHeight; }

g.FillRectangle(new SolidBrush(ChartUtil.GetChartItemColor(i)),barOrigin.X,barOrigin.Y,barWidth,Math.Abs(barHeight));

barOrigin.X = barOrigin.X + (barWidth * 2); }

//画右上角的说明图形

drawInstruction(CHART_LEFT, CHART_HEIGHT, CHART_TOP, g, word, data); //输出图形

fileName = cu.PicPath + Guid.NewGuid().ToString() + \\\".gif\\\"; bm.Save(fileName, ImageFormat.Gif);

//资源回收 bm.Dispose(); g.Dispose();

}

private int drawAxes(int[] data, PointF[] zuoBiaoStart, Graphics g, PointF[] zuoBiaoEnd,ChartUtil cu) {

int chiDu =1;

int[] t = cu.getZuoBiaoValue(data,out chiDu); [Page] for(int i=0;i{

PointF txtPos = new PointF(); txtPos.X = zuoBiaoStart[i].X -50; txtPos.Y = zuoBiaoStart[i].Y - 5;

g.DrawString(t[i].ToString(),new Font(FontWord,8),Brushes.Black,txtPos); g.DrawLine(Pens.Black,zuoBiaoStart[i],zuoBiaoEnd[i]); }

return chiDu; }

private void createCanvas(out Bitmap bm, out Graphics g, out PointF[] zuoBiaoEnd, out PointF[] zuoBiaoStart,ChartUtil cu) {

//建立一个Graphics对象实例

bm = new Bitmap(Pic_Width,Pic_Height); g = Graphics.FromImage(bm); //设置条图图形和文字属性

g.ScaleTransform((Convert.ToSingle(Pic_Width))/SIDE_WIDTH,(Convert.ToSingle(Pic_Height))/SIDE_HEIGHT);

g.SmoothingMode = SmoothingMode.Default; g.TextRenderingHint = TextRenderingHint.AntiAlias;

//设定画布和边

g.Clear(Color.White);

g.DrawRectangle(Pens.Black,0,0,SIDE_WIDTH-1,SIDE_HEIGHT-1);

//设置条形图的边

g.DrawRectangle(new Pen(Color.Black,1),CHART_LEFT,CHART_TOP,CHART_WIDTH, CHART_HEIGHT); if(hasNeg) {

g.DrawRectangle(new Pen(Color.Black,1),CHART_LEFT,CHART_TOP+CHART_HEIGHT,CHART_WIDTH, CHART_HEIGHT); }

zuoBiaoEnd = null;

zuoBiaoStart = cu.getZuoBiaoPoint(new PointF(CHART_TOP,CHART_LEFT),CHART_HEIGHT,CHART_WIDTH,out zuoBiaoEnd,hasNeg); }

private void drawInstruction(int CHART_LEFT, int CHART_HEIGHT, int CHART_TOP, Graphics g, string[] word, int[] data) {

PointF colsNamePoint = new PointF(CHART_LEFT + 55,CHART_HEIGHT + CHART_TOP + 2); [Page] if(hasNeg) {

colsNamePoint = new PointF(CHART_LEFT + 55,CHART_HEIGHT*2 + CHART_TOP + 2); }

PointF boxOrigin = new PointF(Pic_Width*5/6-30,CHART_TOP*1/3); PointF textOrigin = new PointF(Pic_Width*4/5+8,CHART_TOP*1/3 -3 ); for(int i=0;i<2;i++)

{

g.FillRectangle(new SolidBrush(ChartUtil.GetChartItemColor(i)),boxOrigin.X,boxOrigin.Y,20,10);

//g.DrawRectangle(Pens.Black,boxOrigin.X,boxOrigin.Y,20,10);

g.DrawString(word[i],new Font(FontWord,FontSize),Brushes.DarkBlue,colsNamePoint); g.DrawString(data[i].ToString(),new Font(FontWord,FontSize),Brushes.Black,textOrigin);

colsNamePoint.X += 150; boxOrigin.Y += 15; textOrigin.Y += 15; } } }

public class ChartUtil

{

public readonly string PicPath = System.AppDomain.CurrentDomain.BaseDirectory + \\\"Temp/\\\";

public PointF[] getZuoBiaoPoint(PointF orign,int height,int width,out PointF[] endPoint,bool hasNeg)

{

int num = 6;

if(hasNeg) num = 11;

PointF[] startPoint = new PointF[num]; endPoint = new PointF[num]; for(int i =0;iPointF pfStart = new PointF(); PointF pfEnd = new PointF(); pfStart.X = orign.X;

pfEnd.X = orign.X + width;

pfStart.Y = orign.Y + i*height/5; pfEnd.Y = pfStart.Y; [Page] startPoint[i] = pfStart; endPoint[i] = pfEnd; }

return startPoint;

}

public int[] getZuoBiaoValue(int[] data,out int chidu) {

int[] result = new Int32[11]; int Max = data[0];

for(int i=0;iif(Max < data[i]) Max = data[i];

}

string strMax = Max + \\\"\\\";

chidu =(int)((Convert.ToInt32(strMax.Substring(0,1)) +1)* Math.Pow(10,strMax.Length-1))/5;

for(int i=0;iresult[i] = chidu* (5-i) ; }

return result; }

#region get color

public static Color GetChartItemColor(int itemIndex) {

Color selectedColor; switch(itemIndex) {

case 0:

selectedColor = Color.Blue; break;

case 1:

selectedColor = Color.Red; break; case 2:

selectedColor = Color.Yellow; break; case 3:

selectedColor = Color.Purple; break; default:

selectedColor = Color.Green; break; }

return selectedColor; [Page]

}

#endregion } }

因篇幅问题不能全部显示,请点此查看更多更全内容