<%@ Page Language="vb" Debug="true" ContentType="text/html" %>
<%@ import namespace="system.Drawing" %>
<%@ import namespace="system.Drawing.imaging" %>
<%@ import namespace="system.Drawing.Drawing2d" %>
<%@ import namespace="System.Drawing.Text" %>
<script language="vb" runat="server">
    Sub Page_Load()
        Dim mChart= new ChartColumn
        mChart.addvalue(100,"北京分公司","blue")
        mChart.addvalue(600,"重庆分公司","orange")
        mChart.addvalue(500,"上海分公司","red")
        mChart.addvalue(300,"天津分公司","green")
        mChart.addvalue(900,"成都分公司","orange")
        response.write(mChart.SaveChart)
        response.write("<hr><IMG SRC='http://localhost/1.jpeg' ALT='' BORDER=0>")
    End Sub
    class ChartColumn
        Private cNum
        Private iCount
        Private iSum as Integer
        Private cContent(3,20)
        Private maxData as single 
        Public Height as long
        Public Width  as long
        Public FileName
        Public Function AddValue(vnumber as Long, vtext as string ,vcolor as string)
            if iCount>=20 then exit function
            iCount=iCount + 1
            cContent(1,iCount)=vnumber
            cContent(2,iCount)=vtext
            cContent(3,iCount)=vcolor
            cNum=cNum + vNumber
        End Function
        Public Function GetCount() as long
            GetCount=iCount
        End Function
        Public Function GetNum() as long
            GetNum=cNum
        End Function
        Public Function SaveChart() as string
            '初始化对象
            if Height<60 then Height=300
            if Width<100 then Width=400
            Dim b as new bitmap( Width+300, Height, pixelformat.Format16bppRgb555)
            Dim g as graphics = graphics.fromimage(b)
            Dim lbrush As New SolidBrush(color.blue)
            Dim i,iSize as Integer,iTemp,i1 as single,i2 as single
            Dim i3 as single,i4 as single
            g.clear(color.AliceBlue)
            iSum=0
            for i=1 to iCount
                if cContent(1,i) > maxdata then maxdata=cContent(1,i)
            next
            maxdata=(maxdata * 1.15 \ 100 ) * 100
            
            call Drawback(g,0,0)
            i1=(width-80)/4
            i3 = i1 / 4
            for i=1 to iCount
                i2 = cContent(1,i) / maxdata * (Height-80)
                i4 = height - 64 - i2
                iSize = system.math.round(cContent(1,i) * 360 / cNum )
                DrawColumn(g,50+(i-1)*i1+i3,i4,i2,2*i3,cContent(3,i),cContent(2,i))
                savechart = savechart + "<br>" + cContent(2,i) + ":" + str(cContent(1,i))
                iSum = iSum + iSize
            next
            FileName="C:\Inetpub\wwwroot\1.jpeg"
            b.save(FileName, imageformat.jpeg)  
            b.dispose()
        End Function
        Private function Drawback(g,x1,y1)
            Dim i
            Dim dashValues As Single() =  {3, 2, 3, 2}
            Dim blackPen1 As New Pen(Color.Black, 1)
            Dim h1 as single
            Dim salign as new system.Drawing.stringformat
            salign.alignment = stringalignment.center
            blackPen1.DashPattern = dashValues
            Dim blackPen2 As New Pen(Color.Black, 1)
            g.DrawRectangle(blackpen1, 46, 10, width, height-80)
            g.DrawRectangle(blackpen1, 40, 16, width, height-80)
            g.DrawRectangle(blackpen2, 30, height-64, width+10, 1)
            g.DrawRectangle(blackpen2, 40, 16, 1, height-80)
            g.Drawline(blackpen2,40,16,46,10) '左上
            g.Drawline(blackpen2,40,height-64,46,height-70) '左下
            g.Drawline(blackpen2,width-20+60,16,width-14+60,10) '右上
            g.Drawline(blackpen2,width-20+60,height-64,width-14+60,height-70) '右下
            h1=(height-80) / 20
            for i=0 to 20
                if i mod 5 = 0 then
                    g.DrawString((20-i)*maxdata/20, new font("Arial",10),Brushes.black,15,i*h1+9,salign)
                    g.Drawline(blackpen2,30,i*h1+16,40,i*h1+16)
                else
                    g.Drawline(blackpen2,35,i*h1+16,40,i*h1+16)
                End if
            next
        End function
        Private function DrawColumn(g,x1,y1,h1,w1,c1,t1)
            Dim linGrBrush As New LinearGradientBrush( _
                New Point(10,y1-100), _
                New Point(10,y1+h1+100), _
                Color.FromArgb(255, 255, 255, 255), _
                Color.fromName(c1))
            Dim lbrush1 As New SolidBrush(Color.fromName(c1))
            Dim point1 as new PointF(x1, y1)
            Dim point4 as new PointF(x1+w1, y1)
            Dim point2 as new PointF(x1+6, y1-6)
            Dim point3 as new PointF(x1+6+w1, y1-6)            Dim curvePoints1 As PointF() =  {point1, point2, point3, point4}
            Dim point5 as new PointF(x1+w1, y1)
            Dim point6 as new PointF(x1+w1+6, y1-6)
            Dim point7 as new PointF(x1+w1+6, y1+h1-6)
            Dim point8 as new PointF(x1+w1, y1+h1)
            Dim curvePoints2 As PointF() =  {point5, point6, point7, point8}
            g.FillPolygon(lBrush1, curvePoints1)
            g.FillPolygon(lBrush1, curvePoints2)
            g.FillRectangle(linGrBrush,x1, y1, w1, h1)
            Dim salign as new system.Drawing.stringformat
            salign.alignment = stringalignment.center
            g.DrawString(t1, new font("Arial",10),Brushes.black, _
              x1+20,y1+h1+10,salign)
        End function
    End Class
</script>