Sunny's Technology Blog

书山有路勤为径,学海无涯苦作舟

博客园 首页 新随笔 联系 订阅 管理
/**//*
    * **************************************************************
    * Author:SunnyZhao  Vendor:Facet  Date:2005/06/23
    * Description: 简单的VML-Rect控件
    * *************************************************************
*/

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Collections;
using System.Collections.Specialized;

namespace Facet.VML_Chart
{
    
/**//// <summary>
    
/// SimpleRect 的摘要说明。
    
/// </summary>

    [DefaultProperty("Text"), 
    ToolboxData(
"<{0}:SimpleRect runat=server></{0}:SimpleRect>")]
    
public class SimpleRect : System.Web.UI.WebControls.WebControl
    
{
        
private string sOutputText;
        
private string data = "1,2,3";        //数据
        private string dataInfor;    //与数据对应的横坐标信息
        private Unit width  = 500;
        
private Unit height = 400;
        
private string colorArr;    //柱状图的颜色
                
        
string[] aryHorizon;
        
string[] aryDetail;
        
int HorSplitNum;    //X轴分成几份

        
double HorSplitLen;    //X轴每份的 VML 长度
        double VerSplitLen;    //Y轴每份的 VML 长度

        
int intVerSplitAmt;    //Y轴每一份的 VML 长度
        
        
    
        属性区域
#region 属性区域
        
//数据值
        [Bindable(true),Category("Data"),DefaultValue("1,2,3")]
        
public string Data
        
{
            
get
            
{
                
return data;
            }

            
set
            
{
                data
=value;
            }

        }


        
//数据的中文名称(相当于横坐标名称)
        [Bindable(true),Category("Data"),DefaultValue("")]
        
public string DataInfor
        
{
            
get
            
{
                
return this.dataInfor ;
            }

            
set
            
{
                dataInfor
=value;
            }

        }

        
//宽度
        [Bindable(true),Category("Data"),DefaultValue("")]
        
public override Unit Width
        
{
            
get
            
{
                
return this.width;
            }

            
set
            
{
                
base.Width = value;
            }

        }

        
//高度
        [Bindable(true),Category("Data"),DefaultValue("")]
        
public override Unit Height
        
{
            
get
            
{
                
return this.height;
            }

            
set
            
{
                
base.Height = value;
            }

        }


#endregion

        

        
        
protected override void Render(HtmlTextWriter output)
        
{            
            aryHorizon 
= this.DataInfor.Split(',');
            aryDetail  
= this.Data.Split(',');
            HorSplitNum 
= aryHorizon.Length;

            VerSplitLen 
= 4800 / 5;            //纵坐标分成五分,计算每份的长度
            HorSplitLen = 7300 / HorSplitNum;  //横坐标分 HorSplitNum 分,计算每份长度

            
int nAmp=HorSplitNum/5;     //nAmp只是一个系数,因为水平方向画的矩形的多少可以不同,所以宽度要动态改变
            if (nAmp<1)  nAmp = 1;        //因此 nAmp 给定了一个改变宽度的大概的比例系数而已。
            
//开辟VML区域
            
//if(this.Width.Value==0)  this.Width =500;
            if(this.Height.Value==0this.Height=400;
            
this.sOutputText  = "<v:group id='root_0' style='position:relative;width:"+this.Width+";height:"+this.Height+";' coordsize='6000,6000'>";
            
//划X,Y轴
            this.sOutputText += "<v:line from='0,0' to='7300,0' style='z-index:200;'>" 
                             
+  "    <v:stroke endarrow='classic' weight='2px' color='#000000'/>"
                             
+  "</v:line>";
            
this.sOutputText += "<v:line from='0,0' to='0,-5500' style='z-index:200;'>" 
                             
+  "    <v:stroke endarrow='classic' weight='2px' color='#000000'/>" 
                             
+  "</v:line>";

            
if(!(this.DataInfor=="" || this.Data==""))                
            
{
                
//划 X 轴的坐标值
                this.sOutputText += this.DrawHorizontal();

                
//划 Y 轴的坐标值
                this.sOutputText += this.DrawVertical();

                
//划 柱子
                this.sOutputText += this.drawRectDetail(nAmp);
            }

            
//The End
            this.sOutputText += "</v:group>";
            
            output.Write(sOutputText);
        }




        方法区域,划坐标轴以及具体的图形
#region 方法区域,划坐标轴以及具体的图形
        
/**//*
            * **************************************************************
            * Function:    DrawHorizontal()
            * Description: 划横坐标的坐标值 以及 垂直于 X 轴的虚线( 坐标原点 O:(0,0) )
            * Input:       
            * Where Use:   
            * *************************************************************
        
*/

        
private string DrawHorizontal()
        
{
            
string sReturnValue = String.Empty;
            
int i;
            
//划横坐标的坐标值
            for(i = 0;i < HorSplitNum;i ++
            
{    
                
int width = 300;
                
double left  = 0 + (i+0.5* HorSplitLen - width/2;    
                
string htmlHorSplit;
                htmlHorSplit 
= "<v:shape style='left:" + left + ";top:100;width:" + width + ";height:300;'>" 
                             
+ "    <v:textbox inset='0,0,0,0'>" + aryHorizon[i] + "</v:textbox>" 
                             
+ "</v:shape>"
               sReturnValue 
+= htmlHorSplit;
                
/**//*将文字竖起来写
                <table cellpadding='0' cellspacing='0'>
                    <tr>
                        <td style='layout-flow:vertical-ideographic'>" + aryHorizon[i] + "</td>
                    </tr>
                </table>
                上面的方法可以将文字竖起来写
*/
                
            }

            
//划垂直于 X 轴的虚线 
            for(i = 1;i < HorSplitNum;i ++
            
{
                
double XPoint = 0 + (i * HorSplitLen);
                
string line;
                line 
= "<v:line from='"+XPoint+",0' to='"+XPoint+",-5500'>"
                     
+ "    <v:stroke dashstyle='dot' opacity='0.45' weight='0.9pt' color='#000000'/>"
                     
+ "</v:line>";
                sReturnValue 
+= line;
            }


            
return sReturnValue;
        }



        
/**//*
            * **************************************************************
            * Function:    DrawVertical()
            * Description: 划纵坐标的坐标值以及垂直于 Y 轴的虚线
            * Input:       
            * Where Use:   
            * *************************************************************
        
*/

        
private string DrawVertical() 
        

            
string sReturnValue = "";
            
double MaxAmount = 0//用来保存计算出来的纵坐标上数值的最大值,是一个数量值
            int i;
            
for(i=0;i<aryDetail.Length;i++
                
if(Convert.ToDouble(aryDetail[i])>MaxAmount) 
                    MaxAmount 
= Convert.ToDouble(aryDetail[i]);
            
//我们把纵坐标分成了 5 分,所以计算每一个大概相当于多少个单位量,取整数,数量值
            string strVerSplitAmt = Convert.ToString(MaxAmount / 5).Split('.')[0];
              
            
if(strVerSplitAmt == "0"
                intVerSplitAmt 
= 1
            
else 
            

                
if(strVerSplitAmt.Length>=2
                
{   //如 123 ,处理后的值为 130
                    
//intVerSplitAmt = parseInt((parseInt(strVerSplitAmt.substr(0, 1),10)*10 + (parseInt(strVerSplitAmt.substr(1, 1), 10) + 1)) + MakeZeroArray(strVerSplitAmt.length - 2).join(""), 10); 
                    string strTemp = Convert.ToString((Convert.ToInt32(strVerSplitAmt.Substring(0,1))*10)) + Convert.ToString((Convert.ToInt32(strVerSplitAmt.Substring(1,1))+1));
                    
for(i=0;i<strVerSplitAmt.Length-strTemp.Length;i++)
                        strTemp 
+= "0";
                    intVerSplitAmt 
= Convert.ToInt32(strTemp);
                }
 
                
else 
                
{   //如 12 ,处理后的值为 13
                    intVerSplitAmt = Convert.ToInt32(strVerSplitAmt) + 1
                }
 
            }
 
            
//划 Y 纵坐标的坐标值( 坐标原点 O:(0,0) )
            for (i = 1; i <= 5; i ++
            
{    
                
double height = 400;
                
double top    = 0 - VerSplitLen * i - height/2;   //再减去高度的一半,是为了让他看起来是居中的        
                string htmlVerSplit;
                htmlVerSplit 
= "<v:shape style='width:400;left:-400;top:"+top+";height:"+height+"'>" 
                             
+ "    <v:textbox inset='0,0,0,0'>" + intVerSplitAmt*+ "</v:textbox>" 
                             
+ "</v:shape>"
                sReturnValue 
+= htmlVerSplit; 
            }

            
//划垂直于 Y 轴的虚线 ( 坐标原点 O:(0,0) )
            for (i = 1; i <= 5; i ++
            
{
                
double YPoint = 0 - VerSplitLen * i;
                
string line;
                line 
= "<v:line from='0,"+YPoint+"' to='7300,"+YPoint+"'>"
                     
+ "    <v:stroke dashstyle='dot' opacity='0.45' weight='0.9pt' color='#000000'/>"
                     
+ "</v:line>";
                sReturnValue 
+= line; 
            }

            
return sReturnValue;
        }
 


        
/**//*
            * **************************************************************
            * Function:    drawRectDetail()
            * Description: 划柱子( 坐标原点 O:(0,0) )
            * Input:       
            * Where Use:   
            * *************************************************************
        
*/

        
private string drawRectDetail(int intAmp)
        
{
            
string sReturnValue = "";
            
int m = 0;
            
for(m = 0;m < aryDetail.Length;m ++)
            
{   // intAmp 给定了一个大概的矩形宽度的比例系数
                double intWidth = 300.0D/intAmp + 50;
                
double intHeight= Convert.ToDouble(aryDetail[m]) * VerSplitLen / intVerSplitAmt;
                
double top        = 0 - intHeight;
                
double left     = 0 + (m+0.5* HorSplitLen - intWidth/2;        //我们让矩形落在每分的中间
                string title    = aryHorizon[m] + "" + aryDetail[m];                
                            
                
string htmlRect; //划柱子
                htmlRect = "<v:rect style='top:" + top + ";left:" + left + ";height:" + intHeight + ";width:" + intWidth + ";'"
                         
+ "  fillcolor='#0000ff' filled='T' title='" + title + "'" 
                         
+ "  strokecolor='#000000' stroked='T' style='cursor:hand' onclick=alert('" + aryDetail[m] + "')>" 
                         
+ "</v:rect>";                          
                sReturnValue 
+= htmlRect; 
                
                
string htmlDesc; //在柱子上面写注释
                top -= 350;
                htmlDesc 
= "<v:rect  style='top:"+ top + ";left:"+ left + ";height:300;width:" + intWidth +"' fillcolor='#fbd9fb';filled='t'></v:rect>"
                         
+ "<v:shape style='top:"+ top + ";left:"+ left + ";height:300;width:" + intWidth +"'>"
                         
+ "    <v:textbox style='TEXT-ALIGN: center' inset='0,0,0,0'>"+aryDetail[m]+"</v:textbox>"
                         
+ "</v:shap>";
                sReturnValue 
+= htmlDesc;                 
            }
 
            
return sReturnValue;
        }
 

        
#endregion

    }

}
posted on 2005-08-12 12:08  Sunny  阅读(425)  评论(0)    收藏  举报