gdi+绘制走势图

来源:互联网 发布:无网络驱动精灵 编辑:程序博客网 时间:2024/04/27 19:51

略缩图:

以下是代码:

 

using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;

/// <summary>
///
/// </summary>

namespace WebApplication1
{
 /// <summary>
 /// WebForm1 的摘要说明。
 /// </summary>
 public class WebForm1 : System.Web.UI.Page
 {
  public int PicWidth;                                 //图片长度
  public int PicHeight = 640;                                 //图片宽度
  public int IntializeX = 0;                                  //X轴0刻度的值
  public double IntializeY = 0.00;                            //Y轴0刻度的值
  public int XScale = 40;                                     //一刻度长度 X
  public int YScale = 40;                                     //一刻度高度
  public string strXText = "时间(单位:天)";                   //单位 X
  public string strYText = "增长率";                          //单位 Y
  public string strTitle = "2010积极(1)净值增长率变化图";   //标题
  public DataTable Mydt;                                      //要统计的数据
  public int DataCounts = 0;                                  //记录数
  public int Xkedu=5;
  private void Page_Load(object sender, System.EventArgs e)
  {
   DB db = new DB();
   SqlConnection conn = db.SqlConn();
   String strSelect="select * from product where ProductID=1771";
   SqlDataAdapter ds=new SqlDataAdapter(strSelect,conn);
   DataTable st=new DataTable();
   ds.Fill(st);
   string startTime;
   if(st.Rows[0]["DateStart"].ToString()=="")
   {
    string SQL="select top 1 * from NetValue where ProductID=1771 order by NetValueID Asc";
    SqlDataAdapter ss=new SqlDataAdapter(SQL,conn);
    DataTable yxDT=new DataTable();
    ss.Fill(yxDT);
    startTime=yxDT.Rows[0]["Logdate"].ToString();
   }
   else
   { 
    startTime=st.Rows[0]["Logdate"].ToString();
   }
   //开始时间
   DateTime dtstart=Convert.ToDateTime(startTime);

   //结束时间
   string yxEndTime;
   string SQL1="select top 1 * from NetValue where ProductID=1771 order by NetValueID desc";
   SqlDataAdapter ss1=new SqlDataAdapter(SQL1,conn);
   DataTable yxDT1=new DataTable();
   ss1.Fill(yxDT1);
   yxEndTime=yxDT1.Rows[0]["Logdate"].ToString();
   DateTime dtEnd=Convert.ToDateTime(yxEndTime);
   TimeSpan tsyx=dtEnd.Subtract(dtstart);
   int allDays=tsyx.Days;
   PicWidth=allDays * Xkedu + 40;

   if(dtstart>=dtEnd)
   {
    Response.Write("<script>alert('结束日期必须大于开始日期,请重新选择');window.location.href='DrawImage.aspx';</script>");
   }
   else
   {
    //string SQL = "select * from NetValue where ProductID=1771 order by LogDate Asc";
    String SQL=String.Format("select * from NetValue where productID=1771 and Logdate between '{0}' and '{1}'",dtstart,dtEnd);
    SqlDataAdapter sda = new SqlDataAdapter(SQL, conn);
    DataTable dt = new DataTable();
    sda.Fill(dt);
    DataCounts = dt.Rows.Count;
    //创建画布
    Bitmap img = new Bitmap(PicWidth, PicHeight);
    Graphics gh = Graphics.FromImage(img);
    gh.Clear(Color.Snow);
    //绘制表标题,日期单位,增长率单位
    Point pTitle = new Point(0, 10);
    Font Ftitle = new Font("黑体", 16);
    SolidBrush sbTitle = new SolidBrush(Color.Blue);
    gh.DrawString(strTitle, Ftitle, sbTitle, pTitle);

    Font Fcommon = new Font("黑体", 10);
    gh.DrawString(strXText, Fcommon, sbTitle, new Point(50, 40));
    gh.DrawLine(new Pen(Color.Blue, 1), new Point(140, 48), new Point(50, 80));
    gh.DrawString(strYText, Fcommon, sbTitle, new Point(90, 70));
    //绘制Y周正数部分
    Point XZstart = new Point(40, 160);
    Point YZstart = new Point(40, 20);
    Pen p = new Pen(Color.Blue, 1);
    p.DashStyle = DashStyle.Solid;
    p.EndCap = LineCap.ArrowAnchor;
    gh.DrawLine(p, XZstart, YZstart);
    //绘制Y周负数部分
    Point XFstart = new Point(40, 160);
    Point YFstart = new Point(40, PicHeight);
    gh.DrawLine(p, XFstart, YFstart);
    //绘制X轴
    Point Xstart = new Point(40, 160);
    Point Xend = new Point(PicWidth, 160);
    gh.DrawLine(p, Xstart, Xend);
    //给Y轴加上刻度
    int YkeduStartX = 40;
    int YkeduStartY = 40;
    int HeightScore = 3;
    for (int i = 1; i < 16; i++)
    {
     //刻度起始点
     Point KeduYX = new Point(YkeduStartX, YkeduStartY);
     Point KeduYY = new Point(YkeduStartX + 2, YkeduStartY);
     Pen pn = new Pen(Color.Blue, 1);
     gh.DrawLine(pn, KeduYX, KeduYY);
     //定义画刷
     SolidBrush sb = new SolidBrush(Color.Blue);
     //给刻度旁添加对应涨跌值
     string flag = HeightScore.ToString() + "%";
     gh.DrawString(flag, new Font("黑体", 10), sb, new Point(8, YkeduStartY - 5));
     YkeduStartX = YkeduStartX + 0;
     YkeduStartY = YkeduStartY + 40;
     HeightScore = HeightScore - 1;
    }

    //定义Format对象,设置文字为竖直
    System.Drawing.StringFormat sf = new System.Drawing.StringFormat();
    sf.FormatFlags = StringFormatFlags.DirectionVertical;
    //给X轴加上刻度
    int XkeduStartX = 40;
    int XkeduStartY = 160;
    DateTime DateDT = dtstart;

    while(DateDT<=dtEnd)
    {
     Point KeduXX = new Point(XkeduStartX, XkeduStartY);
     Point KeduXy = new Point(XkeduStartX, XkeduStartY - 3);
     Pen pn = new Pen(Color.Blue, 1);
     gh.DrawLine(pn, KeduXX, KeduXy);
     //给刻度绘制日期,日期间隔为一周
     string strDate = string.Format("{0:yyyy-MM-dd}", DateDT);
     SolidBrush sb = new SolidBrush(Color.Blue);
     Font font = new Font("黑体", 9);
     Point pWeeks = new Point(XkeduStartX-12, XkeduStartY + 15);
     gh.DrawString(strDate, font, sb, pWeeks, sf);
     XkeduStartX = XkeduStartX + Xkedu*7;
     XkeduStartY = XkeduStartY + 0;
     DateDT = DateDT.AddDays(7);
    }

    //14格,每格40像素,每格代表1
    //以增长率除以1%,得到比例, 再乘以40,得到纵坐标
    //每条记录,往X轴正向加8像素
    //定义初始化点
    float X = 40.0f;
    float Y = 160.0f;
    //定义初始化新点
    float NewX;
    float NewY;

    //循环绘制
    //少绘制一条,留出最后一条来设置颜色
    for (int i = 0; i < DataCounts; i++)
    {
     //有%,不能直接转换成Double类型,做字符串处理
     string NetGrowth = dt.Rows[i]["NetGrowth"].ToString();
     NetGrowth = NetGrowth.Replace("%", "");
     double Temp = Convert.ToDouble(NetGrowth);
     float Num = (float)Temp / 100;
     float Percent = Num / 0.01f;

     

     //初始化点B
     if (Percent < 0)
     {
      //NewX = X + 8;
      //计算X坐标
      DateTime dtYx=Convert.ToDateTime(dt.Rows[i]["Logdate"]);
      TimeSpan ts=dtYx.Subtract(dtstart);
      int Days=ts.Days;
      NewX=40+Days*Xkedu;
      NewY = 160.0f - Percent * 40;
     }
     else if (Percent > 0)
     {
      //NewX = X + 8;
      //计算X坐标
      DateTime dtYx=Convert.ToDateTime(dt.Rows[i]["Logdate"]);
      TimeSpan ts=dtYx.Subtract(dtstart);
      int Days=ts.Days;
      NewX=40+Days*Xkedu;
      NewY = 160.0f - Percent * 40;
     }
     else
     {
      //NewX = X + 0;
      //计算X坐标
      DateTime dtYx=Convert.ToDateTime(dt.Rows[i]["Logdate"]);
      TimeSpan ts=dtYx.Subtract(dtstart);
      int Days=ts.Days;
      NewX=40+Days*Xkedu;
      NewY = 160.0f - Percent * 40;
     }

     //绘制直线
     //System.Drawing.ColorTranslator.FromHtml("#ffffff")
     if (i == DataCounts - 1)
     {
      if (Percent > 0)
      {
       Pen ZZLp = new Pen(Color.Green, 2);
       ZZLp.DashStyle = DashStyle.Solid;
       ZZLp.EndCap = LineCap.RoundAnchor;
       gh.DrawLine(ZZLp, X, Y, NewX, NewY);
      }
      else
      {
       Pen ZZLp = new Pen(Color.Red, 2);
       ZZLp.DashStyle = DashStyle.Solid;
       ZZLp.EndCap = LineCap.RoundAnchor;
       gh.DrawLine(ZZLp, X, Y, NewX, NewY);
      }
     }
     else
     {
      Pen ZZLp = new Pen(Color.Blue, 2);
      ZZLp.DashStyle = DashStyle.Solid;
      ZZLp.EndCap = LineCap.RoundAnchor;
      gh.DrawLine(ZZLp, X, Y, NewX, NewY);
     }

     //存储新点作为下次绘制直线的起点
     X = NewX;
     Y = NewY;
    }

    //输出图片
    //img.Save(Response.OutputStream, ImageFormat.Jpeg);
    img.Save(Server.MapPath("images/Pic.jpg"), ImageFormat.Jpeg);
    gh.Dispose();
    img.Dispose();

    //Response.Write("<script>alert('净值增长率变化图生成成功,请在网站前台理财中心浏览!');</script>");
   }  
  }

  #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

 }
}

原创粉丝点击