在ASP.NET中动态生成图形(转)

原创 2005年04月25日 21:49:00

StockPicker.aspx:

<script language="VB" runat=server>

   Sub ChartBtn_Click(Sender as Object, E as EventArgs)

      chart.ImageUrl = "ImageGenerator_Vb.aspx?"

      chart.Visible = true

      For i=0 to Stocks.Items.Count-1

         If (Stocks.Items(i).Selected = true) Then

             chart.ImageUrl = chart.ImageUrl & "symbols=" & Stocks.Items(i).Value & "&"

         End If

      Next

   End Sub

</script>

<html>

   <body>

      <form runat=server>

         <h1>Scott's Stock Picker</h1>

         <asp:checkboxlist id="Stocks" runat=server>

             <asp:listitem>MSFT</asp:listitem>

             <asp:listitem>SUN</asp:listitem>

         </asp:checkboxlist>

         <asp:button text="Chart Your Selected Stocks" OnClick="ChartBtn_Click" runat=server/>

         <hr>

         <asp:Image id="chart" ImageUrl="" Visible=false runat=server/>

      </form>

   </body>

</html>

 

ImageGenerator_VB.aspx:

<%@ Page Language="VB" ContentType="image/jpeg" %>

<%@ Import Namespace="System.Drawing" %>

<%@ Import Namespace="System.Drawing.Drawing2D" %>

<%@ Import Namespace="System.Drawing.Imaging" %>

<%@ Import Namespace="ChartGenerator" %>

<%@ OutputCache Duration="10" %>

<script language="VB" runat=server>

    Function GetStockDetails(Symbol as String) as ChartLine

        Dim myChartLine as new ChartLine

        if (symbol = "msft") then

            Dim StockValues() as Single = { 60, 110, 120, 180, 185, 190, 240, 290 }

            myChartLine.Width = 5

            myChartLine.Color = Color.Blue

            myChartLine.LineStyle = DashStyle.Solid

            myChartLine.Title = "Microsoft Corp. (MSFT)"

            myChartLine.Symbol = "MSFT"

            myChartLine.Values = StockValues

            return myChartLine

        elseif (symbol = "sun") then

            Dim StockValues() as Single = { 180, 155, 125, 60, 25, 15, 10, 3 }

            myChartLine.Width = 5

            myChartLine.Color = Color.Red

            myChartLine.LineStyle = DashStyle.Dot

            myChartLine.Title = "Sun Corp. (Sun)"

            myChartLine.Symbol = "Sun"

            myChartLine.Values = StockValues

            return myChartLine

        end if

        return nothing

    End Function

    Sub Page_Load(Sender as Object, E as EventArgs)

        ' Generate Chart Data For Image....

        Dim XAxes() as String = { "9:00AM", "9:30AM", "10:00AM", "11:00AM", "12:00AM", "1:00PM", "1:30PM" }

        Dim MyChartData as New ChartData

        MyChartData.YTickSize = 20

        MyChartData.YMax = 250

        MyChartData.YMin = 0

        MyChartData.XAxisTitles = XAxes

        Dim Symbols() as String = Request.QueryString.GetValues("symbols")

        if (Not Symbols = Nothing) then

           for i=0 to Symbols.Length-1

              Dim stockValue as ChartLine = GetStockDetails(symbols(i).ToLower)

              If (stockValue <> nothing) then

                 myChartData.Lines.Add(stockValue)

              End if

           Next

        end if

        ' Create In-Memory BitMap of JPEG

        Dim MyChartEngine as New ChartEngine

        Dim StockBitMap as BitMap = MyChartEngine.DrawChart(600, 400, myChartData)

        ' Render BitMap Stream Back To Client

        StockBitMap.Save(Response.OutputStream, ImageFormat.JPEG)

     End Sub

</script>

 

ChartEngine.cs:

using System.WinForms;

using System.Collections;

using System.Collections.Bases;

using System.Drawing;

using System.Drawing.Drawing2D;

using System.Drawing.Imaging;

using System.ComponentModel;

using System;

using System.IO;

namespace ChartGenerator  {

    //Core Line Data structure

    public struct LineData {

        public float[] LineValues  ;

        public string LineTitle ;

        public string LineSymbol ;

    }

 

    //Line Data plus display style information

    public class ChartLine {

        private Color lineColor ;

        private LineData lineData ;

        private DashStyle lineStyle ;

        private int lineWidth  ;

        //Constructors

        public ChartLine() :base() {}

        public ChartLine(LineData lineData) :base() {

            this.lineData = lineData;

        }

        //Properties

        public Color Color {

            get { return lineColor ; }

            set { lineColor = value ; }

        }

        public DashStyle LineStyle {

            get { return lineStyle ; }

            set { lineStyle = value ; }

        }

       

        public string Symbol {

            get { return lineData.LineSymbol ; }

            set { lineData.LineSymbol = value ; }

        }

        public string Title {

            get { return lineData.LineTitle ; }

            set { lineData.LineTitle = value ; }

        }

        public float[] Values {

            get { return lineData.LineValues ; }

            set { lineData.LineValues = value ; }

        }

        public int Width {

            get { return lineWidth ; }

            set { lineWidth = value ; }

        }

 

        //Methods

        public void SetLineData(LineData lineData) {

            this.lineData = lineData;

        }

    }

 

    //Chart Data structure

    public class ChartData {

        private float yTickSize;

        private float yMax;

        private float yMin;

        private string[] xAxisTitles ;

        private ChartLineList lines = new ChartLineList();

        private Color gridColor=Color.Blue;

        private bool showHGridLines=true;

        private bool showVGridLines=true;

        //Properties

        public float YTickSize {

            get { return yTickSize ; }

            set { yTickSize = value ; }

        }

        public float YMax {

            get { return yMax ; }

            set { yMax = value ; }

        }

 

        public float YMin {

            get { return yMin ; }

            set { yMin = value ; }

        }

        public string[] XAxisTitles {

            get { return xAxisTitles ; }

            set { xAxisTitles = value ; }

        }

        public ChartLineList Lines {

            get { return lines ; }

            set { lines = value ; }

        }

        public Color GridColor {

            get { return gridColor ; }

            set { gridColor = value ; }

        }

        public bool ShowHGridLines {

            get { return showHGridLines ; }

            set { showHGridLines = value ; }

        }

        public bool ShowVGridLines {

            get { return showVGridLines ; }

            set { showVGridLines = value ; }

        }

        //Collection of Chart Lines

        public class ChartLineList : TypedCollectionBase {

            public ChartLine this[int index] {

               get {

                   return (ChartLine)(List[index]);

               }

               set {

                   List[index] = value;

               }

            }

            public int Add(ChartLine value) {

               return List.Add(value);

            }

            public void Insert(int index, ChartLine value) {

               List.Insert(index, value);

            }

            public int IndexOf(ChartLine value) {

               return List.IndexOf(value);

            }

            public bool Contains(ChartLine value) {

               return List.Contains(value);

            }

            public void Remove(ChartLine value) {

               List.Remove(value);

            }

            public void CopyTo(ChartLine[] array, int index) {

               List.CopyTo(array, index);

            }

       }   

    }

 

    //Charting Engine - draws a chart based on the given ChartData

    public class ChartEngine {

        private ChartData chartData ;

        private float left;

        private float right;

        private float top;

        private float bottom;

        private float tickCount;

        private float yCount;  

        private float hspacing;

        private float vspacing;

        private Graphics g;

        private Rectangle r;

        private Color backColor;

        private Color foreColor;

        private Font baseFont;

        private Font legendFont;

        private RectangleF legendRect;

        public ChartEngine() {

        }                          

        public Bitmap DrawChart(int width, int height, ChartData chartData) {

           Bitmap newBitmap = new Bitmap(width,height,PixelFormat.Format32bppARGB);

           Graphics g = Graphics.FromImage(newBitmap);

           Rectangle r = new Rectangle(0, 0, width, height);

           Color myForeColor = Color.Black;

           Color myBackColor = Color.White;

           Font myFont = new Font("Arial", 10);

           this.DrawChart(g, r, myBackColor, myForeColor, myFont, chartData);

           return newBitmap;

        }

         public void DrawChart(Graphics g, Rectangle r, Color backColor, Color foreColor, Font baseFont, ChartData chartData) {

            this.chartData = chartData;

            this.g = g;

            this.r = r;

            this.backColor = backColor;

            this.foreColor = foreColor;

            this.baseFont = baseFont;

            this.legendFont = new Font(baseFont.FontFamily, (baseFont.Size * 2/3), baseFont.Style | FontStyle.Bold);

            g.SmoothingMode = SmoothingMode.AntiAlias;

            CalculateChartDimensions();       

            DrawBackground();

            InternalDrawChart() ;

        }

 

        private void CalculateChartDimensions() {

            right = r.Width - 5;

            top = 5 * baseFont.Size ;

            bottom = r.Height - baseFont.Size * 2;

            tickCount = chartData.YMin ;

            yCount = (chartData.YMax-chartData.YMin) / chartData.YTickSize ;

            hspacing = (bottom-top) / yCount;

            vspacing = (right) / chartData.XAxisTitles.Length;

            //Left depends on width of text - for simplicities sake assume that largest yvalue is the biggest

            //Take into account the first X Axis title

            float maxYTextSize = g.MeasureString(chartData.YMax.ToString(), baseFont).Width;

            float firstXTitle = g.MeasureString(chartData.XAxisTitles[0], baseFont).Width;

            left = (maxYTextSize > firstXTitle) ? maxYTextSize : firstXTitle ;

            left = r.X + left + 5 ;

            //Calculate size of legend box

            float maxLegendWidth = 0 ;

            float maxLegendHeight = 0 ;

            //Work out size of biggest legend

            foreach (ChartLine cl in chartData.Lines) {

                float currentWidth = g.MeasureString(cl.Title, legendFont).Width;

                float currentHeight = g.MeasureString(cl.Title, legendFont).Height;

                maxLegendWidth = (maxLegendWidth > currentWidth) ? maxLegendWidth : currentWidth ;

                maxLegendHeight = (maxLegendHeight > currentHeight) ? maxLegendHeight : currentHeight ;

            }

            legendRect = new RectangleF(r.X+2, r.Y+2, maxLegendWidth + 25 + 5, ((maxLegendHeight+2)*chartData.Lines.Count) + 3) ;

        }

        private void DrawBackground() {

            LinearGradientBrush b = new LinearGradientBrush(r, Color.SteelBlue, backColor,LinearGradientMode.Horizontal);

            g.FillRectangle(b, r);

            b.Dispose();

        }

        private void InternalDrawChart() {

             DrawGrid() ;

            foreach (ChartLine cl in chartData.Lines) {

                DrawLine(cl);

            }

            DrawLegend() ;

            //Draw time on chart

            string timeString = "Generated:" + DateTime.Now.ToLongTimeString() ;

            SizeF textsize = g.MeasureString(timeString,baseFont);

            g.DrawString(timeString, baseFont, new SolidBrush(foreColor), r.Width - textsize.Width - 5, textsize.Height * 2 / 3) ;

        }                      

        private  void DrawGrid() {

            Pen gridPen = new Pen(chartData.GridColor) ;

 

            //Vertical - include tick desc's

            if (chartData.ShowVGridLines) {

                for (int i = 0 ; (vspacing * i) < right; i++) {

                    float x = left + (vspacing *i);          

                    string desc = chartData.XAxisTitles[i];

                    g.DrawLine(gridPen, x,top,x,bottom +(baseFont.Size*1/3));

                    SizeF textsize = g.MeasureString(desc,baseFont);

                    g.DrawString(desc, baseFont, new SolidBrush(chartData.GridColor), x-(textsize.Width/2), bottom + (baseFont.Size*2/3)) ;

                }

            }

            //Horizontal

            if (chartData.ShowHGridLines) {

                for (float i = bottom ; i > top; i-=hspacing) {

                    string desc = tickCount.ToString();

                    tickCount+=chartData.YTickSize;

                    g.DrawLine(gridPen, right, i, left-3, i);

                    SizeF textsize = g.MeasureString(desc,baseFont);

                    g.DrawString(desc, baseFont, new SolidBrush(chartData.GridColor), left-textsize.Width - 3, i - (textsize.Height/2)) ;

                }

            }

        }

        private void DrawLine(ChartLine chartLine) {

            Pen linePen = new Pen(chartLine.Color);

            linePen.StartCap = LineCap.Round;

            linePen.EndCap = LineCap.Round;

            linePen.Width = chartLine.Width ;

            linePen.DashStyle = chartLine.LineStyle;

            PointF[] Values = new PointF[chartLine.Values.Length];

            float scale = hspacing / chartData.YTickSize ;

            for (int i = 0 ; i < chartLine.Values.Length; i++) {

                float x = left + vspacing * i;          

                Values[i] = new PointF(x, bottom-chartLine.Values[i]*scale);

            }

            g.DrawLines(linePen, Values);

        }

         private void DrawLegend() {

            //Draw Legend Box

            ControlPaint.DrawBorder(g, (Rectangle)legendRect, SystemColors.WindowFrame, ButtonBorderStyle.Solid);

            LinearGradientBrush b = new LinearGradientBrush(legendRect, backColor, Color.SteelBlue, LinearGradientMode.Horizontal);

            r.Inflate(-1, -1);

            g.FillRectangle(b, legendRect);

            b.Dispose();

            float startY = 5;

            foreach (ChartLine cl in chartData.Lines) {

                Pen p = new Pen(cl.Color) ;

                p.Width = p.Width*4;

                SizeF textsize = g.MeasureString(cl.Title, legendFont);

                float lineY = startY + textsize.Height / 2 ;

                g.DrawLine(p, r.X + 7, lineY, r.X + 25, lineY);

                g.DrawString(cl.Title, legendFont, new SolidBrush(foreColor), r.X + 30, startY);

                startY += (textsize.Height+2);

            }

        }

    }

}

在ASP.NET中动态生成图形

.NET有一个很灵巧的特性,就是可以编写代码生成动态图形,然后将生成的图形保存在磁盘上或者直接将其发送到客户端的浏览器。 原理 用.NET生成图形的功能封装在System.Drawin...

ASP.NET+JQuery+.Ashx实现+百度Echarts 实现动态柱状图数据图形报表的统计

最终效果图如下:

ASP.NET动态生成按钮(转)

ASP.NET动态生成TextBox并获取其值 动态生成的文本框,生成的是HTML控件,所以获取文本框的值  控时,要注意获取的方法,不同时间获取的方法不同.(页面一架载完时的值 和 控件的原有值改变...

关于ASP.net中生成图形验证码

一、步骤:①随机生成

asp.net使用ashx生成图形验证码

验证码的好处不用我多说,你们都懂的。我在网上看到有人把验证码直接写在aspx页面里,也就是说这种方式请求验证码等于请求一个页面,这样做很不科学。如下所示 ...

asp.net 生成图形验证码(字母和数字混合)

验证码技术是网站开发过程中比较重要的技术,可以防止非法人员利用注册机或者登陆工具来攻击我们的网站。下面是效果图:具体实现方法如下:1、主要思路是:引用Using System.Drawing命名空间,...

ASP.NET动态生成静态页面的实例代码

实现静态页面的生成并没有实现分页功能。其主要原理就是读取数据库的数据然后替换掉静态模板页的内容。 1,首先制作一个模板页,暂时命名为template.htm。 生成静态页面_www....

asp.net vb新闻页动态生成静态页面的实例代码

首先 建立一个页面1.html  模板页 生成静态页有很多好处,可以缓解服务器压力、方便搜索网站搜索等等,下面介绍一下生成静态页的实例代码,有需要的朋友可以参考一下 最近突然想把项目中...

ASP.NET动态生成TextBox并获取其值

动态生成的文本框,生成的是HTML控件,所以获取文本框的值  控时,要注意获取的方法,不同时间获取的方法不同.(页面一架载完时的值 和 控件的原有值改变时  两种情况)   public pa...

c#语言asp.net实现treeview控件读数据库动态生成树的代码

遍历TreeView节点(递归算法)  private void g 8h"@Page_Load(object sender,System.EventArgs e)  {  GetAllNo...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在ASP.NET中动态生成图形(转)
举报原因:
原因补充:

(最多只允许输入30个字)