gdi+ 트렌드 차트 그리기

썸네일:

코드는 다음과 같습니다.

 

시스템 사용;
System.Web 사용;
System.Web.UI 사용;
System.Web.UI.WebControls 사용;
System.Data 사용;
System.Data.SqlClient 사용;
System.Drawing 사용;
System.Drawing.Imaging 사용;
System.Drawing.Drawing2D 사용;

/// <요약>
///
/// </요약>

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="제품 ID가 1771인 NetValue에서 상위 1개 선택 * NetValueID Asc로 주문";     SqlDataAdapter ss=new SqlDataAdapter(SQL,conn);     DataTable yxDT=새 DataTable();     ss.Fill(yxDT);     startTime=yxDT.Rows[0]["Logdate"].ToString();    }    else    {      startTime=st.Rows[0]["Logdate"].ToString();    }    //开始时间    DateTime dtstart=Convert.ToDateTime(startTime);











   //종료시간
   문자열 yxEndTime;
   string SQL1="제품 ID가 1771인 NetValue에서 상위 1개 선택 * NetValueID desc별 주문";
   SqlDataAdapter ss1=새 SqlDataAdapter(SQL1,conn);
   DataTable yxDT1=새 DataTable();
   ss1.Fill(yxDT1);
   yxEndTime=yxDT1.Rows[0]["로그 날짜"].ToString();
   DateTime dtEnd=Convert.ToDateTime(yxEndTime);
   TimeSpan tsyx=dtEnd.Subtract(dtstart);
   int allDays=tsyx.일;
   PicWidth=allDays * Xkedu + 40;

   if(dtstart>=dtEnd)
   {     Response.Write("<script>alert('종료 날짜는 시작 날짜보다 이후여야 합니다. 다시 선택하십시오.');window.location.href='DrawImage.aspx';</ script>") ;    }    else    {     //string SQL = "제품 ID=1771인 NetValue에서 * 선택 LogDate Asc로 주문";     String SQL=String.Format("productID=1771인 NetValue에서 * 선택 및 '{0 사이의 Logdate }' 및 '{1}'",dtstart,dtEnd);     SqlDataAdapter sda = new SqlDataAdapter(SQL, conn);     DataTable dt = new DataTable();     sda.Fill(dt);     DataCounts = dt.Rows.Count;     / /캔버스 비트맵 만들기     img = new Bitmap(PicWidth, PicHeight);     Graphics gh = Graphics.FromImage(img);     gh.Clear(Color.Snow);














    //테이블 제목, 날짜 단위, 성장률 단위를 그립니다.
    Point pTitle = new Point(0, 10);
    Font Ftitle = new Font("Black body", 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);
    포인트 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); //      옆에 해당 상승 및 하강 값      문자열 추가 스케일 플래그 = 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);      글꼴 글꼴 = 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을 곱하여 수직 좌표를 얻습니다.
    //각 레코드에 대해 양의 방향에 8픽셀을 더합니다. X 축의
    //초기화 포인트 정의
    float X = 40.0f;
    float Y = 160.0f;
    //초기화 새 포인트 정의
    float NewX;
    float NewY;

    //그리기 순환 //      하나
    위해 마지막 하나 저장
    설정하기      색상을
    덜      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+일*Xkedu;       NewY = 160.0f - 퍼센트 * 40;      }      그렇지 않으면 (백분율 > 0)      {       //NewX = X + 8;       // 计算X坐标       DateTime dtYx=Convert.ToDateTime(dt.Rows[i]["Logdate"]);       TimeSpan ts=dtYx.Subtract(dtstart);       int Days=ts.Days;       NewX=40+일*Xkedu;       NewY = 160.0f - 퍼센트 * 40;      }      다른



















     {       //NewX = X + 0;       // 计算X坐标       DateTime dtYx=Convert.ToDateTime(dt.Rows[i]["Logdate"]);       TimeSpan ts=dtYx.Subtract(dtstart);       int Days=ts.Days;       NewX=40+일*Xkedu;       NewY = 160.0f - 퍼센트 * 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);       }      }      다른      {

















      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 Forms Designer 생성 코드
  재정의 protected void OnInit(EventArgs e)
  {    //    // CODEGEN: 이 호출은 ASP.NET Web Forms Designer에 필요합니다.    //    InitializeComponent();    base.OnInit(e);   }   /// <summary> /// 디자이너 지원에 필요한 메서드 - 코드 편집기를 사용하여   /// 이 메서드의 내용을   수정하지 마십시오 .   /// </summary>   private void InitializeComponent()   {       this.Load += new System.EventHandler(this.Page_Load);






  






  }
  #endregion

 }
}

おすすめ

転載: blog.csdn.net/susieweijs/article/details/5903212