扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:黎宇 来源:天极开发 2007年11月21日
关键字:
//***************************************************************************** // PDAChartControlControl using System; using System.Collections; using System.ComponentModel; using System.Drawing; using System.Data; using System.Windows.Forms; using System.Drawing.Drawing2D; #if NETCFDESIGNTIME [assembly: System.CF.Design.RuntimeAssemblyAttribute("_ PDAChartControl, Version=1.10.0.0, Culture=neutral, PublicKeyToken=null")] namespace PDAChartControl { /// <summary> /// Summary description for UserControl1. /// </summary> public class PDAChart : System.Windows.Forms.Control { public System.Windows.Forms.HScrollBar hScrollBar1; private PDAChartControl.MyGraph objGraph=new MyGraph(); private Point mBeginPoint=new Point(0,0) ; private System.ComponentModel.Container components = null; public PDAChart() { InitializeComponent(); } #region Windows 属性定义 private Font mTitleFont =new Font("Arial", 9, FontStyle.Regular); private Font mTextFont =new Font("Arial", 8, FontStyle.Regular); #if NETCFDESIGNTIME [System.ComponentModel.Category("PDAChart")] [System.ComponentModel.Description("设置/读取文本字体")] #endif public Font TextFont { get { return mTextFont; } set { mTextFont=value; this.Invalidate(); } } private static DataTable mDataTable=new DataTable() ; #if NETCFDESIGNTIME [System.ComponentModel.Category("PDAChart")] [System.ComponentModel.Description("设置/读取数据表")] #endif public DataTable dataTable { get { return mDataTable; } set { mDataTable=(DataTable)value; this.Invalidate(); } } private string mShowColumnName; #if NETCFDESIGNTIME [System.ComponentModel.Category("PDAChart")] [System.ComponentModel.Description("设置/读取显示列")] #endif public string ShowColumnName { get { return mShowColumnName; } set { mShowColumnName=value; this.Invalidate(); } } private string mDataColumnName; #if NETCFDESIGNTIME [System.ComponentModel.Category("PDAChart")] [System.ComponentModel.Description("设置/读取数据列")] #endif public string DataColumnName { get { return mDataColumnName; } set { mDataColumnName=value; this.Invalidate(); } } private string mTitle="统计图"; #if NETCFDESIGNTIME [System.ComponentModel.Category("PDAChart")] [System.ComponentModel.DefaultValueAttribute("图表")] [System.ComponentModel.Description("设置/读取标题")] #endif public string Title { get { return mTitle; } set { mTitle=value; this.Invalidate(); } } private Color mBackColor=System.Drawing.SystemColors.ControlLight; #if NETCFDESIGNTIME [System.ComponentModel.Category("PDAChart")] [System.ComponentModel.DefaultValueAttribute(0)] [System.ComponentModel.Description("设置/读取背景颜色")] #endif public override Color BackColor { get { return mBackColor; } set { mBackColor =value; this.Invalidate(); } } /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if( components != null ) components.Dispose(); } base.Dispose( disposing ); } #region Component Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the Code Editor. /// </summary> private void InitializeComponent() { this.Paint += new System.Windows.Forms.PaintEventHandler(this.OnPaint); } #endregion // // private ArrayList mCudeData; protected override void OnResize(EventArgs e) { //this.Refresh(); } Graphics mGraphics; Pen mBlackPen=new Pen(Color.Black); //偏差 int TopHeightWarp=16; //顶偏差(文本高) int LeftWidthWarp=0; //左偏差(最大数据文本宽) int UnderHeightWarp=10; //底偏差(底文本高) int BetweenLineHeight=10;//水平线的高 int LineCount=10;//水平线数 // //This Paint function uses routines common to both platforms. int ClientHeight; int mWidth; int YHeight; Rectangle rcClient; System.Drawing.Region Region1; public void OnPaint(object sender, System.Windows.Forms.PaintEventArgs e) {//base.Paint(null,e); mGraphics=e.Graphics; //读取数据 this.rcClient = this.ClientRectangle; Region1=new Region ( this.rcClient); Region1=Region1.Clone(); ClientHeight=rcClient.Height; objGraph.mGraphics=e.Graphics; //mGraphics.MeasureString// //计算最大的x轴、y轴坐标 //写标题 DrawTitle(rcClient); int Width=rcClient.Width-this.mLenght-LeftWidthWarp; mWidth=Width; int Height=rcClient.Height-this.mLenght-TopHeightWarp-UnderHeightWarp; this.YHeight= Height; int Lenght=this.mLenght; //开始点 int b=Height/2; Point LeftTopPoint=new Point(rcClient.X+10,rcClient.Y+TopHeightWarp+20 ); //mPicHeight=25; objGraph.DrawCake(this.mBackColor, LeftTopPoint,Width,b,this.mPicHeight); //中心点 Point oPoint=new Point (); oPoint.X=LeftTopPoint.X +Width/2; oPoint.Y=LeftTopPoint.Y+b/2; CreatePic(oPoint,Width/2,b/2); } //在顶部中心位置写标题 private void DrawTitle(Rectangle rcClient) { int Width=(int)objGraph.mGraphics.MeasureString(this.mTitle,mTitleFont).Width; int Height=(int)objGraph.mGraphics.MeasureString(this.mTitle,mTitleFont).Height; this.TopHeightWarp=Height; int x=rcClient.Width/2- Width/2; int y=rcClient.Y+Height/2-5; this.objGraph.DrawText(this.mTitle,Color.Blue,mTitleFont,x,y); } //求数据列的和 private double SumColumn(DataTable dt,string ColumnName) { double Sum=0.0; foreach(DataRow dr in dt.Rows) { Sum+=System.Convert.ToDouble(dr[ColumnName]); } return Sum; } //以中心点,长轴Width,短轴高Height建立饼图 private void CreatePic(Point CenterP ,int Width,int Height) { if(mDataTable.Rows.Count==0) return; //角度相对值 double Sum=SumColumn(mDataTable,this.mDataColumnName); double angle=360/Sum; double FinishAngle=0.0; int RowIndex=0; Color[] color={Color.Red,Color.Blue,Color.Green,Color.Yellow,Color.YellowGreen,_ Color.Magenta,Color.Cyan,Color.Coral,Color.SlateGray,Color.Pink,Color.Crimson,_ Color.DodgerBlue,Color.Chartreuse,Color.Orange,Color.Aqua,Color.CadetBlue }; foreach(DataRow dr in mDataTable.Rows) { RowIndex++; double Data=System.Convert.ToDouble(dr[this.mDataColumnName]) ; //显示列数据+"-"+数据列百分比 string text=dr[this.mShowColumnName].ToString()+"-"+(100*System.Math.Round(Data/Sum,2)).ToString()+"%" ; int ColorIndex=RowIndex; if (ColorIndex>=color.Length) ColorIndex=color.Length-1; if (this.mShowXText==false) text=" "; AddOnePDAPic(color[ColorIndex-1],text,angle*Data,FinishAngle,CenterP,Width,Height); FinishAngle+=angle*Data; } } //画扇形(逆时针) //角度angle,已经画过的角FinishAngle,中心点oPoint,长半轴a,短半轴b public void AddOnePDAPic(Color color, string Text,double angle,double FinishAngle,Point oPoint,int a,int b) { // Create solid brush. SolidBrush Brush = new SolidBrush(color); ArrayList pList=objGraph.GetPicPoints(angle,FinishAngle,oPoint,a,b); Point[] curvePoints=new Point[pList.Count] ; for(int i=0;i<pList.Count;i++) curvePoints[i]=(Point)pList[i]; mGraphics.FillPolygon(Brush, curvePoints); //画边框 Point centerP; //求中心角的点位置 if (pList.Count>1) { mGraphics.DrawPolygon(this.mBlackPen, curvePoints); centerP=curvePoints[pList.Count/2]; } else centerP=curvePoints[0]; centerP.X=(centerP.X+oPoint.X)/2; if (centerP.Y>oPoint.Y) centerP.Y=(centerP.Y+oPoint.Y)/2; else centerP.Y=(centerP.Y+oPoint.Y)/3; //确定文本位置 int txtWidth=(int)objGraph.mGraphics.MeasureString(Text,this.mTextFont).Width; //int txtHeight=(int)objGraph.mGraphics.MeasureString(Text,this.mTextFont).Height; centerP.X=centerP.X-txtWidth/2; //centerP.Y+=txtHeight/2; if (FinishAngle==0) { centerP.Y-=5; centerP.X+=10; } if (FinishAngle>=120) { centerP.Y-=5; centerP.X-=10; } if (FinishAngle>=180) { centerP.Y+=15; centerP.X-=10; } if (FinishAngle>=200) { //centerP.Y+=15; centerP.X+=20; } if (FinishAngle>=270) { //centerP.Y+=5; centerP.X+=5; } if (FinishAngle>=300) { centerP.Y+=5; centerP.X+=15; } objGraph.DrawText(Text,Color.Black,this.mTextFont,centerP.X,centerP.Y); } } #region public class MyGraph { //网络水平线中二线之间的高 //int BetweenLineHeight=20; //最大MaxYCount:线数 // int MaximumY=10; // int Lenght=5; // int Width=200; // int Height=300; // bool IsShowGrid=true; public Graphics mGraphics; //背景色 // public Color BackColor= System.Drawing.SystemColors.Control; // //X轴颜色 // public Color AxesXColor=System.Drawing.SystemColors.HighlightText; // //Y轴颜色 // public Color AxesYColor=System.Drawing.SystemColors.Info; //黑色笔 private Pen mBlackPen = new System.Drawing.Pen(Color.FromArgb(0,0,0)); //网格线笔 private Pen mGridPen= new System.Drawing.Pen(Color.FromArgb(127, 127, 127)); //Color BackColor= System.Drawing.Color.FromArgb(((System.Byte)(224)), ((System.Byte)(224)), ((System.Byte)(224))); public MyGraph() { //mGraphics=this.CreateGraphics(); // // TODO: 在此处添加构造函数逻辑 // } //由左下顶点与宽、高画颜色为color的平行四边形 public void DrawRectangle3DTop(Color color, Point LeftUnderPoint,int Width,int Height) { try { //计算左上顶点 Point p1=new Point (); p1.X=LeftUnderPoint.X+Height; p1.Y=LeftUnderPoint.Y-Height; //计算右上顶点 Point p2=new Point (); p2.X=LeftUnderPoint.X+Width+Height; p2.Y=LeftUnderPoint.Y-Height; //计算右下顶点 Point p3=new Point (); p3.X=LeftUnderPoint.X+Width; p3.Y=LeftUnderPoint.Y; Point[] curvePoints = { LeftUnderPoint, p1, p2, p3 }; // Define fill mode. //FillMode newFillMode = FillMode.Winding; // Fill polygon to screen. // Create solid brush. SolidBrush Brush = new SolidBrush(color); mGraphics.FillPolygon(Brush, curvePoints); //mGraphics.FillPolygon(Brush, curvePoints, newFillMode); //画边框 mGraphics.DrawPolygon(this.mBlackPen, curvePoints); } catch(Exception ex) { string str=ex.Message; } } //由左下顶点与宽、高画颜色为color的平等四边形 public void DrawRectangle3DRight(Color color, Point LeftUnderPoint,int Width,int Height) { try { // Create solid brush. SolidBrush Brush = new SolidBrush(color); //计算左上顶点 Point p1=new Point (); p1.X=LeftUnderPoint.X; p1.Y=LeftUnderPoint.Y-Height; //计算右上顶点 Point p2=new Point (); p2.X=p1.X+Width; p2.Y=p1.Y-Width; //计算右下顶点 Point p3=new Point (); p3.X=LeftUnderPoint.X+Width; p3.Y=LeftUnderPoint.Y-Width; Point[] curvePoints = { LeftUnderPoint, p1, p2, p3 }; // Define fill mode. //FillMode newFillMode = FillMode.Winding; // Fill polygon to screen. mGraphics.FillPolygon(Brush, curvePoints); //画边框 mGraphics.DrawPolygon(this.mBlackPen, curvePoints); //mGraphics.FillPolygon(Brush, curvePoints, newFillMode); } catch(Exception ex) { string str=ex.Message; } } //由左上角顶点与宽、高画颜色为color的平行四边形 public void DrawRectangle(Color color, Point P,int Width,int Height) { Rectangle Rectangle1=new Rectangle( P.X,P.Y, Width,Height); // Create solid brush. SolidBrush Brush = new SolidBrush(color); // Fill polygon to screen. mGraphics.FillRectangle(Brush, Rectangle1); //画边框 mGraphics.DrawRectangle(this.mBlackPen,Rectangle1); } //由左下顶点与长、宽、高画颜色为color的立方图形(3D) public void DrawCube(Color color, Point LeftUnderPoint,int Lenght,int Width,int Height) { // Create solid brush. SolidBrush Brush = new SolidBrush(color); Point LeftTopPoint= LeftUnderPoint; LeftTopPoint.Y-= Height; DrawRectangle3DTop(color,LeftTopPoint,Width,Lenght); DrawRectangle(color,LeftTopPoint,Width,Height); Point RightP=LeftUnderPoint; RightP.X+=Width; DrawRectangle3DRight(Color.Black,RightP,Lenght,Height); } //画X轴 public void DrawAxesX(Color color, Point p,int Width,int Height) { DrawRectangle3DTop(color,p,Width,Height); } //画Y轴 public void DrawAxesY(Color color, Point p,int Width,int Height) { DrawRectangle3DRight(color,p,Width,Height); } //由顶点与长、宽、高画颜色为color,背景色为的BackColor图表(3D) public void DrawPDAChart(Color GridLineColor,Color AxesXColor,Color AxesYColor,_ Color BackColor,Point p,int Lenght,int Width,int Height,bool IsShowAxesX,bool IsShowAxesY) { if(IsShowAxesX) { //画X轴 DrawAxesX(AxesXColor,p,Width,Lenght); } if(IsShowAxesY) { //画Y轴 DrawAxesY(AxesYColor,p,Lenght,Height); } ////画图形区 Point pRectangle=p; pRectangle.X+=Lenght; pRectangle.Y-=Lenght; pRectangle.Y-=Height; DrawRectangle(BackColor,pRectangle,Width,Height); } //画一条水平网络线与对应的折线 public void DrawGridLine(Color GridLineColor,Point p,int Width,int Lenght) { //Draw the Y scale; Point EndP=p; EndP.X+=Width; Pen pen=new Pen( GridLineColor); //this.mGraphics.DrawLine(pen,p,EndP); //水平线 this.mGraphics.DrawLine(pen,p.X,p.Y,EndP.X,EndP.Y ); //左折线 this.mGraphics.DrawLine(pen,p.X,p.Y,EndP.X-Lenght,EndP.Y+Lenght ); } //画所有水平网络线 //p:起始点;Width:线宽;BetweenHeight:二线之间高,Count:线数 public void DrawGridLines(Color GridLineColor,Point p,int Width,int Lenght,int BetweenHeight,int Count) { Pen pen=new Pen( GridLineColor); for(int i=0;i<Count;i++) { //DrawGridLine(GridLineColor,p,Width,Lenght); //水平线 this.mGraphics.DrawLine(pen,p.X,p.Y,p.X+Width,p.Y ); //左折线 this.mGraphics.DrawLine(pen,p.X-Lenght+1,p.Y+Lenght,p.X,p.Y); p.Y-=BetweenHeight; } } //在位置(x,y)处以颜色color、字体font写文本text public void DrawText(string text,Color color, Font font,int x,int y) { // Create solid brush. SolidBrush Brush = new SolidBrush(color); this.mGraphics.DrawString(text, font, Brush, x ,y); } //由点p(矩形左上角点),宽pieWidth,高pieHeight,颜色color画馅饼图 public void DrawCake(Color color,Point p,int pieWidth,int pieLenght,int pieHeight) { Pen PenBlack=new Pen( Color.Black); //黑色最下面的椭圓 Rectangle rc1 =new Rectangle(p.X,p.Y+pieHeight,pieWidth,pieLenght); this.mGraphics.DrawEllipse(PenBlack,rc1); SolidBrush objBrush = new SolidBrush(color); for(int i=0;i<pieHeight;i++) { this.mGraphics.FillEllipse(objBrush,p.X,p.Y+i,pieWidth,pieLenght); } //黑色最上面的椭圓 Rectangle rc =new Rectangle(p.X,p.Y,pieWidth,pieLenght); this.mGraphics.DrawEllipse(PenBlack,rc); this.mGraphics.DrawLine( PenBlack,p.X,p.Y+pieLenght/2,p.X,p.Y+pieHeight+pieLenght/2); this.mGraphics.DrawLine( PenBlack,p.X+pieWidth,p.Y+pieLenght/2,p.X+pieWidth,p.Y+pieHeight+pieLenght/2); } //求隋圆任意一点x坐标的相对点 //角angle,中心点oPoint,a,长半轴,b,短半轴 public double GetEllipsePX(double angle,int a,int b) { //角 double radians = angle * (Math.PI/180); double px=a*System.Math.Cos(radians) ; return px; } //求隋圆任意一点y坐标的相对点 //角angle,中心点oPoint,a,长半轴,b,短半轴 public double GetEllipsePY(double angle,int a,int b) { //角 double radians = angle * (Math.PI/180); double py=b*System.Math.Sin(radians); return py; } //画线椭圆线 //角angle,中心点oPoint,a,长半轴,b,短半轴 public void DrawEllipseLine(double angle,Point oPoint,int a,int b) { int px=System.Convert.ToInt32(GetEllipsePX(angle,a,b))+oPoint.X ; int py=System.Convert.ToInt32(GetEllipsePY(angle,a,b))+oPoint.Y ; Pen PenBlack=new Pen( Color.Black); this.mGraphics.DrawLine( PenBlack,oPoint.X,oPoint.Y,px,py); //e.Graphics.DrawLine( PenBlack,oPoint.X,oPoint.Y,oPoint.X+b,oPoint.Y); } //取扇形的点集(逆时针) //角angle,已经画过的角FinishAngle,中心点oPoint,长半轴a,短半轴b public ArrayList GetPicPoints(double angle,double FinishAngle,Point oPoint,int a,int b) { //Point[System.Convert.ToInt32(angle)] curvePoints=new Array() ; //以步长为1求扇形弧线的坐标点 ArrayList pList=new ArrayList() ; pList.Add(oPoint); //pList.Add(ArcStartPoint); for(int i=0;i<System.Convert.ToInt32(angle);i++) { int px=System.Convert.ToInt32(GetEllipsePX(i+FinishAngle,a,b))+oPoint.X ; int py=System.Convert.ToInt32(GetEllipsePY(i+FinishAngle,a,b))+oPoint.Y ; pList.Add(new Point(px,py)); //curvePoints.SetValue( } return pList; } //画扇形(逆时针) //角度angle,已经画过的角FinishAngle,中心点oPoint,长半轴a,短半轴b public void DrawPDAPic(Color color, string text,double angle,double FinishAngle,Point oPoint,int a,int b) { // Create solid brush. SolidBrush Brush = new SolidBrush(color); ArrayList pList=GetPicPoints(angle,FinishAngle,oPoint,a,b); Point[] curvePoints=new Point[pList.Count] ; for(int i=0;i<pList.Count;i++) curvePoints[i]=(Point)pList[i]; mGraphics.FillPolygon(Brush, curvePoints); //画边框 mGraphics.DrawPolygon(this.mBlackPen, curvePoints); //DrawText(text,Color.Black,this. } } #endregion |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者