using   System;  
  using   System.Collections;  
  using   System.ComponentModel;  
  using   System.Data;  
  using   System.Drawing;  
  using   System.Web;  
  using   System.Web.SessionState;  
  using   System.Web.UI;  
  using   System.Web.UI.WebControls;  
  using   System.Web.UI.HtmlControls;  
  using   System.Drawing.Imaging;  
   
  namespace   实现简单曲线图  
  {  
  ///   <summary>  
  ///   WebForm1   的摘要说明。  
  ///   </summary>  
  public   class   LineChart   :   System.Web.UI.Page  
  {  
  public   Bitmap   b   ;  
  public   string   Title   =   "在ASP.NET中实现数据图表"   ;  
  public   ArrayList   chartValues   =   new   ArrayList   (   )   ;  
  public   float   Xorigin   =   0   ,   Yorigin   =   0   ;  
  public   float   ScaleX   ,   ScaleY   ;  
  public   float   Xdivs   =   2   ,   Ydivs   =   2   ;  
   
  private   int   Width   ,   Height   ;  
  private   Graphics   g   ;  
  private   Page   p   ;  
   
  struct   datapoint    
  {  
  public   float   x;  
  public   float   y;  
  public   bool   valid;  
  }  
   
  private   void   Page_Load(object   sender,   System.EventArgs   e)  
  {  
  //   在此处放置用户代码以初始化页面  
  LineChart   c=   new   LineChart   (   640   ,   480   ,   Page   )   ;  
  c.Title   =   "   在ASP.NET中实现数据图表"   ;  
  c.Xorigin   =   0   ;   c.ScaleX   =   500   ;   c   .   Xdivs   =   5   ;  
  c   .   Yorigin   =   0   ;   c   .   ScaleY   =   1000   ;   c   .   Ydivs   =   5   ;  
  c   .   AddValue   (   0   ,   150   )   ;  
  c   .   AddValue   (   50   ,   50   )   ;  
  c   .   AddValue   (   100   ,   700   )   ;  
  c   .   AddValue   (   200   ,   150   )   ;  
  c   .   AddValue   (   300   ,   450   )   ;  
  c   .   AddValue   (   400   ,   75   )   ;  
  c   .   AddValue   (   450   ,   450   )   ;  
  c   .   AddValue   (   500   ,   250   )   ;  
  c   .   Draw   (   )   ;  
  }  
   
  #region   Web   窗体设计器生成的代码  
  override   protected   void   OnInit(EventArgs   e)  
  {  
  //  
  //   CODEGEN:   该调用是   ASP.NET   Web   窗体设计器所必需的。  
  //  
  InitializeComponent();  
  base.OnInit(e);  
  }  
   
  ///   <summary>  
  ///   设计器支持所需的方法   -   不要使用代码编辑器修改  
  ///   此方法的内容。  
  ///   </summary>  
  private   void   InitializeComponent()  
  {          
  this.Load   +=   new   System.EventHandler(this.Page_Load);  
  }  
  #endregion  
  public     LineChart(   int   myWidth   ,   int   myHeight   ,   Page   myPage   )    
  {  
  Width   =   myWidth   ;   Height   =   myHeight   ;  
  ScaleX   =   myWidth   ;   ScaleY   =   myHeight   ;  
  b   =   new   Bitmap   (   myWidth   ,   myHeight   )   ;  
  g   =   Graphics   .   FromImage   (   b   )   ;  
  p   =   myPage   ;  
  }  
   
  public   void   AddValue   (   int   x   ,   int   y   )    
  {  
  datapoint   myPoint   ;  
  myPoint   .   x   =   x   ;  
  myPoint   .   y   =   y   ;  
  myPoint   .   valid   =   true   ;  
  chartValues   .   Add   (   myPoint   )   ;  
  }  
   
  public   void   Draw   (   )    
  {  
  int   i   ;  
  float   x   ,   y   ,   x0   ,   y0   ;  
  string   myLabel   ;  
  Pen   blackPen   =   new   Pen   (   Color   .   Blue   ,   2   )   ;//定义画笔  
  Brush   blackBrush   =   new   SolidBrush   (   Color   .   Black   )   ;//定义画刷  
  Font   axesFont   =   new   Font   (   "arial"   ,   10   )   ;//定义字体  
   
  //首先要创建图片的大小  
  p   .   Response   .   ContentType   =   "image/jpeg"   ;  
  g   .   FillRectangle   (   new   SolidBrush   (   Color   .   LightGreen   )   ,   0   ,   0   ,   Width   ,   Height   )   ;  
  int   ChartInset   =   50   ;  
  int   ChartWidth   =   Width   -   (   2   *   ChartInset   )   ;  
  int   ChartHeight   =   Height   -   (   2   *   ChartInset   )   ;  
  g   .   DrawRectangle   (   new   Pen   (   Color   .   Black   ,   1   )   ,   ChartInset   ,   ChartInset   ,   ChartWidth   ,   ChartHeight   )   ;  
  //写出图片上面的图片内容文字  
  g   .   DrawString   (   Title   ,   new   Font   (   "arial"   ,   14   )   ,   blackBrush   ,   Width   /   3   ,   10   )   ;  
  //沿X坐标写入X标签  
  for   (   i   =   0   ;   i   <=   Xdivs   ;   i++   )    
  {  
    x   =   ChartInset   +   (   i   *   ChartWidth   )   /   Xdivs   ;  
    y   =   ChartHeight   +   ChartInset   ;  
    myLabel   =   (   Xorigin   +   (   ScaleX   *   i   /   Xdivs   )   )   .   ToString   (   )   ;  
    g   .   DrawString   (   myLabel   ,   axesFont   ,   blackBrush   ,   x   -   4   ,   y   +   10   )   ;  
    g   .   DrawLine   (   blackPen   ,   x   ,   y   +   2   ,   x   ,   y   -   2   )   ;  
  }  
  //沿Y坐标写入Y标签  
  for   (   i   =   0   ;   i   <=   Ydivs   ;   i++   )  
        {  
        x   =   ChartInset   ;  
        y   =   ChartHeight   +   ChartInset   -   (   i   *   ChartHeight   /   Ydivs   )   ;  
        myLabel   =   (   Yorigin   +   (   ScaleY   *   i   /   Ydivs   )   )   .   ToString   (   )   ;  
        g   .   DrawString   (   myLabel   ,   axesFont   ,   blackBrush   ,   5   ,   y   -   6   )   ;  
        g   .   DrawLine   (   blackPen   ,   x   +   2   ,   y   ,   x   -   2   ,   y   )   ;  
        }  
  g   .   RotateTransform   (   180   )   ;  
  g   .   TranslateTransform   (   0   ,   -   Height   )   ;  
  g   .   TranslateTransform   (   -   ChartInset   ,   ChartInset   )   ;  
  g   .   ScaleTransform   (   -   1   ,   1   )   ;  
   
  //画出图表中的数据  
  datapoint   prevPoint   =   new   datapoint   (   )   ;  
  prevPoint.valid   =   false   ;  
  foreach   (   datapoint   myPoint   in   chartValues   )    
  {  
  if   (   prevPoint   .   valid   ==   true   )    
  {  
  x0   =   ChartWidth   *   (   prevPoint   .   x   -   Xorigin   )   /   ScaleX   ;  
  y0   =   ChartHeight   *   (   prevPoint   .   y   -   Yorigin   )   /   ScaleY   ;  
  x   =   ChartWidth   *   (   myPoint   .   x   -   Xorigin   )   /   ScaleX   ;  
  y   =   ChartHeight   *   (   myPoint   .   y   -   Yorigin   )   /   ScaleY   ;  
  g   .   DrawLine   (   blackPen   ,   x0   ,   y0   ,   x   ,   y   )   ;  
  g   .   FillEllipse   (   blackBrush   ,   x0   -   2   ,   y0   -   2   ,   4   ,   4   )   ;  
  g   .   FillEllipse   (   blackBrush   ,   x   -   2   ,   y   -   2   ,   4   ,   4   )   ;  
  }  
  prevPoint   =   myPoint   ;  
  }  
   
  //最后以图片形式来浏览  
  b   .   Save   (   p   .   Response   .   OutputStream   ,   ImageFormat   .   Jpeg   )   ;  
  }  
  ~LineChart(   )    
  {  
  g   .   Dispose   (   )   ;  
  b   .   Dispose   (   )   ;  
  }  
   
   
  }  
  }
posted on 2007-03-18 17:11  Yang-S  阅读(741)  评论(0)    收藏  举报