扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:黎宇 来源:天极开发 2007年11月11日
关键字:
//***************************************************************************** // 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; /// <summary> /// Required designer variable. /// </summary> // Delegate declaration. // public delegate void EventHandler(string text,Color BackColor,int Height); // // //声明事件的委托: // //public delegate void MyEventHandler(string text,Color BackColor,int Height); // //定义一个公共事件成员 // public event EventHandler AddCube; // protected virtual void OnAddCube(EventArgs e) // { // // } // private PDAChartControl.MyGraph objGraph=new MyGraph(); private Point mBeginPoint=new Point(0,0) ; private System.ComponentModel.Container components = null; public PDAChart() { InitializeComponent(); } public enum ChartTypeEnum { PillarChart, CakeChart ,BreakLinkChart}; #region Windows 属性定义 private bool mhScrollBarVisible=true; #if NETCFDESIGNTIME [System.ComponentModel.Category("PDAChart")] [System.ComponentModel.DefaultValueAttribute(0)] [System.ComponentModel.Description("设置/读取滚动条是否可见")] #endif public bool hScrollBarVisible { get { return mhScrollBarVisible; } set { mhScrollBarVisible =value; this.Invalidate(); } } private ChartTypeEnum mChartType=ChartTypeEnum.PillarChart; #if NETCFDESIGNTIME [System.ComponentModel.Category("PDAChart")] [System.ComponentModel.DefaultValueAttribute(0)] [System.ComponentModel.Description("设置/读取图形类型")] #endif public ChartTypeEnum ChartType { get { return mChartType; } set { mChartType =value; this.Invalidate(); } } private int mPicHeight=20; #if NETCFDESIGNTIME [System.ComponentModel.Category("PDAChart")] [System.ComponentModel.DefaultValueAttribute(0)] [System.ComponentModel.Description("设置/读取饼图高")] #endif public int PicHeight { get { return mPicHeight; } set { mPicHeight =value; this.Invalidate(); } } private Font mTitleFont =new Font("Arial", 9, FontStyle.Regular); #if NETCFDESIGNTIME [System.ComponentModel.Category("PDAChart")] [System.ComponentModel.Description("设置/读取文本字体")] #endif public Font TitleFont { get { return mTitleFont; } set { mTitleFont=value; this.Invalidate(); } } 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 ArrayList mCubeData; #if !NETCFDESIGNTIME //The actual Data used to draw the line on the graph public ICollection CubeData { get { return mCubeData; } set { mCubeData = new ArrayList(value); Rectangle rcClient = this.ClientRectangle; Rectangle rcGraphClient = new Rectangle(rcClient.X + 21, rcClient.Y + 5, rcClient.Width - 21, rcClient.Height - 21); this.Invalidate(rcGraphClient); } } #endif 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(); } } private Color mAxesXColor=System.Drawing.SystemColors.HighlightText; #if NETCFDESIGNTIME [System.ComponentModel.Category("PDAChart")] [System.ComponentModel.DefaultValueAttribute(0)] [System.ComponentModel.Description("设置/读取X轴颜色")] #endif public Color AxesXColor { get { return mAxesXColor; } set { mAxesXColor =value; this.Invalidate(); } } private Color mAxesYColor=System.Drawing.SystemColors.Info; #if NETCFDESIGNTIME [System.ComponentModel.Category("PDAChart")] [System.ComponentModel.DefaultValueAttribute(0)] [System.ComponentModel.Description("设置/读取Y轴颜色")] #endif public Color AxesYColor { get { return mAxesYColor; } set { mAxesYColor =value; this.Invalidate(); } } private int mLenght = 4; #if NETCFDESIGNTIME // These design time attributes affect appearance of this property in the property grid. [System.ComponentModel.DefaultValueAttribute(5)] [System.ComponentModel.Description("立体长")] #endif //The lower Y bound of the PDAChart public int Lenght { get { return mLenght; } set { mLenght = value; this.Invalidate(); } } private int mMaxYValue ;//图表Y轴最大值 private int mMaxXValue ;//图表X轴最大值 private Color mGridLineColor=System.Drawing.Color.Cyan; #if NETCFDESIGNTIME [System.ComponentModel.Category("PDAChart")] [System.ComponentModel.Description("网格线的颜色.")] #endif //The color of the line of the PDAChart. public Color GridLineColor { get { return mGridLineColor; } set { mGridLineColor =value; this.Invalidate(); } } private bool mShowXText = true; #if NETCFDESIGNTIME // These design time attributes affect appearance of this property in the property grid. [System.ComponentModel.Category("Chart")] [System.ComponentModel.DefaultValueAttribute(true)] [System.ComponentModel.Description("是否显示X轴的文本")] #endif // If true, shows the Y-Values on the left of the PDAChart public bool IsShowXText { get { return mShowXText; } set { mShowXText = value; this.Invalidate(); } } private bool mShowYText = true; #if NETCFDESIGNTIME // These design time attributes affect appearance of this property in the property grid. [System.ComponentModel.Category("Chart")] [System.ComponentModel.DefaultValueAttribute(true)] [System.ComponentModel.Description("是否显示Y轴的数字")] #endif // If true, shows the Y-Values on the left of the PDAChart public bool IsShowYText { get { return mShowYText; } set { mShowYText = value; this.Invalidate(); } } private bool mShowXScale = true; #if NETCFDESIGNTIME // These design time attributes affect appearance of this property in the property grid. [System.ComponentModel.Category("Chart")] [System.ComponentModel.DefaultValueAttribute(true)] [System.ComponentModel.Description("是否显示X轴的刻度.")] #endif // If true, shows the X-Values on the bottom of the PDAChart public bool IsShowXScale { get { return mShowXScale; } set { mShowXScale = value; this.Invalidate(); } } private bool mShowYScale = true; #if NETCFDESIGNTIME // These design time attributes affect appearance of this property in the property grid. [System.ComponentModel.Category("Chart")] [System.ComponentModel.DefaultValueAttribute(true)] [System.ComponentModel.Description("是否显示Y轴的刻度")] #endif // If true, shows the Y-Values on the left of the PDAChart public bool IsShowYScale { get { return mShowYScale; } set { mShowYScale = value; this.Invalidate(); } } private bool mShowGrid = true; #if NETCFDESIGNTIME // These design time attributes affect appearance of this property in the property grid. [System.ComponentModel.Category("Chart")] [System.ComponentModel.DefaultValueAttribute(false)] [System.ComponentModel.Description("是否显示网格线")] #endif // If true, shows horiztonal grid lines on the PDAChart. public bool IsShowGrid { get { return mShowGrid; } set { mShowGrid = value; this.Invalidate(); } } #endregion /// <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); this.hScrollBar1 = new System.Windows.Forms.HScrollBar(); this.hScrollBar1.Location = new System.Drawing.Point(1, 100); this.hScrollBar1.Maximum = 1; this.hScrollBar1.LargeChange = 1; this.hScrollBar1.Size = new System.Drawing.Size(100, 16); this.hScrollBar1.ValueChanged += new System.EventHandler(this.hScrollBar1_ValueChanged); this.Controls.Add(this.hScrollBar1); } #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轴坐标 CountMaxScaleXScaleY(); UnderHeightWarp=(int)objGraph.mGraphics.MeasureString("文本",this.mTextFont).Height+5; UnderHeightWarp+=this.hScrollBar1.Height; //作图的范围区(开始点、长、宽、高) mBeginPoint.X =this.ClientRectangle.X+LeftWidthWarp ; mBeginPoint.Y =this.ClientRectangle.Y+rcClient.Height-UnderHeightWarp ; //写标题 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; //设置流动条 // this.hScrollBar1.Location = new System.Drawing.Point(0, rcClient.Y+rcClient.Height); InitPage(); if (this.hScrollBarVisible) { this.hScrollBar1.Left=0; this.hScrollBar1.Top=rcClient.Height-this.hScrollBar1.Height ; this.hScrollBar1.Maximum=this.PageCount-1; if(rcClient.Width<246) this.hScrollBar1.Width= rcClient.Width; else this.hScrollBar1.Width=246; } else { this.hScrollBar1.Left=0; this.hScrollBar1.Top=0 ; } //从此分别画图 if (this.mMaxYValue>10) { //水平网络线 this.BetweenLineHeight=(int)objGraph.mGraphics.MeasureString("文本",this.mTextFont).Height; this.LineCount=Height/BetweenLineHeight; } else { this.BetweenLineHeight=Height/10; //线数应该是能整 this.LineCount=10; } //画与它父相同背景颜色的区域,以隐藏角边 Color ParentBackColor=Color.Brown; objGraph.DrawRectangle( ParentBackColor,new Point(0,0),rcClient.Width,rcClient.Height); e.Graphics.DrawRectangle(new Pen(ParentBackColor), rcClient); objGraph.DrawPDAChart(this.mGridLineColor, this.mAxesXColor,this.mAxesYColor,_ this.mBackColor,mBeginPoint,Lenght,Width,Height, this.mShowXScale,this.mShowYScale); //画线和左文本(内部左下点) Point p=mBeginPoint; p.X+=this.mLenght; p.Y-=this.mLenght; DrawGridLineAndTexts(p,Width); //mBeginPoint //画矩形与写文本 //CreateCubes(mBeginPoint,Width,rcClient.Height); //mBeginPoint.X+=10; CreatePageCubes(mBeginPoint,Width,ClientHeight); DrawTitle(rcClient); } } //以左下坐标p,颜色color,长Lenght,宽Width,高Height,x轴文本textX,画立体图 public void AddOneCube(string textX,Point p,Color color,int Lenght,int Width, int Height) { try { objGraph.DrawCube (color,p,Lenght,Width,Height); //文本 int txtWidth=(int)objGraph.mGraphics.MeasureString(textX,mTextFont).Width; int txtHeight=(int)objGraph.mGraphics.MeasureString(textX,mTextFont).Height; int x=(p.X+Width/2)-txtWidth/2; int y=p.Y+txtHeight/2; this.objGraph.DrawText(textX,Color.Black,this.mTextFont,x,y-5); } catch(Exception ex) { string str=ex.Message; }} //一页立方体图形个数 int OnePageCubeCount=10; int CurrentPage=0;//当前页 int PageCount=0;//多少页 //水平轴的相对值 int XScale; //Y轴的相对值 double YScale=0.2; 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 }; //计算页 private void InitPage() { if(this.OnePageCubeCount==0) return; if (mDataTable.Rows.Count<OnePageCubeCount) this.OnePageCubeCount=mDataTable.Rows.Count ; if(this.OnePageCubeCount==0) return; PageCount=mDataTable.Rows.Count/this.OnePageCubeCount; //水平轴的相对值 XScale=Width/this.OnePageCubeCount ; //Y轴的相对值 if(this.mMaxYValue<=0) return; { if(this.mMaxYValue==0) return; this.YScale=double.Parse(this.YHeight.ToString())/double.Parse( this.mMaxYValue.ToString() ) ;//System.Math. //this.YScale=double.Parse(this.YScale.ToString())/double.Parse(this.LineCount.ToString() ); } // this.YScale=double.Parse(System.Convert.ToString(1))/double.Parse( this.mMaxYValue.ToString() ) ;//System.Math. } private void hScrollBar1_ValueChanged(object sender, System.EventArgs e) { //OnPaint(object sender, System.Windows.Forms.PaintEventArgs e) //清画出的图 this.CurrentPage=hScrollBar1.Value; // if (mGraphics.Clip==null) // { mGraphics=this.CreateGraphics (); this.objGraph.mGraphics=mGraphics; // } //mGraphics.Clip=this.Region1; //画矩形与写文本,最多一屏 //mGraphics.Clear(this.mBackColor) ; //mGraphics.ResetClip(); //CreatePageCubes(mBeginPoint,Width,ClientHeight); System.Windows.Forms.PaintEventArgs e1=new PaintEventArgs( mGraphics,this.rcClient); OnPaint(null,e1); } public void NextPage() { this.objGraph.mGraphics=this.CreateGraphics (); this.CurrentPage++; Bitmap bm = new Bitmap(10,10); Graphics g = Graphics.FromImage(bm); if (this.CurrentPage>this.PageCount) this.CurrentPage--; //画矩形与写文本,最多一屏 //mGraphics.Clear(Color.Red) ; //mGraphics.ResetClip(); CreatePageCubes(mBeginPoint,Width,ClientHeight); } //在左下顶点,宽Width,高Height建立立方体 private void CreatePageCubes(Point BeginP ,int Width,int Height) { if(mDataTable.Rows.Count==0) return; int Between=10; switch(this.OnePageCubeCount) { case 1: Between= mWidth/2; break; case 2: Between= mWidth/3; break; case 3: Between= mWidth/4; break; case 4: Between= mWidth/5; break; case 5: Between= mWidth/6; break; case 6: Between= mWidth/7; break; case 7: Between= mWidth/8-1; break; case 8: Between= mWidth/9-2; break; case 9: Between=mWidth/9-5; break; case 10: Between=mWidth/10-5; break; } int RowIndex=this.OnePageCubeCount*this.CurrentPage; Point p=BeginP;//dr. p.X-=8; for ( int i=0;i<this.OnePageCubeCount;i++ ) { //p.X= this.XScale*(i+1)+10; p.X+=Between+this.mLenght; double CubeHeight=this.YScale*System.Convert.ToInt32(mDataTable.Rows[RowIndex][this.mDataColumnName]); //if ((p.X >= 0) && (p.X <= Width) && (p.Y >= 0) && (p.Y <= Height)) //{ string text=mDataTable.Rows[RowIndex][this.mShowColumnName].ToString() ; string Data=mDataTable.Rows[RowIndex][this.mDataColumnName].ToString() ; int ColorIndex=RowIndex; if (ColorIndex>=color.Length) ColorIndex=color.Length-1; if (this.mShowXText==false) text=" "; AddOneCube(text,p,color[i],this.mLenght,this.mLenght+4,System.Convert.ToInt32(CubeHeight)); //} RowIndex++; } } //在左下顶点,宽Width,高Height建立立方体 private void CreateCubes(Point BeginP ,int Width,int Height) { if(mDataTable.Rows.Count==0) return; //水平轴的相对值 int XScale=Width/mDataTable.Rows.Count ; //Y轴的相对值 if(this.mMaxYValue<=0) return; int YScale=Height/(this.mMaxYValue*this.LineCount) ; 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 }; foreach(DataRow dr in mDataTable.Rows) { RowIndex+=1; Point p=BeginP;//dr. p.X= XScale*RowIndex+10; int CubeHeight=YScale*System.Convert.ToInt32(dr[this.mDataColumnName]); if ((p.X >= 0) && (p.X <= Width) && (p.Y >= 0) && (p.Y <= Height)) { string text=dr[this.mShowColumnName].ToString() ; string Data=dr[this.mDataColumnName].ToString() ; int ColorIndex=RowIndex; if (ColorIndex>=color.Length) ColorIndex=color.Length-1; if (this.mShowXText==false) text=" "; AddOneCube(text,p,color[ColorIndex-1],this.mLenght,this.mLenght+5,CubeHeight); //objGraph.DrawCube (color,p,this.mLenght,Width,Height); } } } //计算最大的x、y轴坐标,左边文本宽,最小的线高 private void CountMaxScaleXScaleY() { if(mDataTable.Rows.Count==0) return; this.mMaxXValue=mDataTable.Rows.Count ; this.mMaxYValue=0; //this.l. foreach(DataRow dr in mDataTable.Rows) { int CubeHeight=System.Convert.ToInt32(dr[this.mDataColumnName]); if (mMaxYValue<CubeHeight) { mMaxYValue=CubeHeight; } int TextWidth=(int)objGraph.mGraphics.MeasureString(System.Convert.ToDouble( dr[this.mDataColumnName])._ ToString() ,this.mTextFont).Width+10; if (LeftWidthWarp<TextWidth) { LeftWidthWarp=TextWidth; } } //LeftWidthWarp+=10; } //在顶部中心位置写标题 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); } //画所有水平网络线 //p:起始点;Width:线宽;BetweenHeight:二线之间高,Count:线数 // private void DrawGridLineAndTexts(Point p,int Width) // { // for(int i=0;i<this.LineCount;i++) // { // DrawGridLineAndText(p,p,Width,Lenght); // p.Y-=BetweenHeight; // } // } //由顶点与长、宽、高画颜色为color,背景色为的BackColor图表(3D) private void DrawGridLineAndTexts(Point p,int Width) {//是否显示网络水平线 if (this.mShowGrid) { this.objGraph.DrawGridLines(this.mGridLineColor,p,Width-1,this.mLenght,this.BetweenLineHeight,this.LineCount); } //是否显示左文本 if (this.mShowYText) { Point p1=p; //p1.X-=this.mLenght; p1.Y+=Lenght; double a1=double.Parse(System.Convert.ToString(this.LineCount-1)); double a2=double.Parse(this.mMaxYValue.ToString()); double a=System.Math.Round(a2/a1,1); for(int i=0;i<this.LineCount;i++) { string Text=System.Convert.ToString(a*(i+1)); int txtWidth=(int)objGraph.mGraphics.MeasureString(Text,this.mTextFont).Width; p1.X=p.X-txtWidth-this.mLenght;; p1.Y-=this.BetweenLineHeight; this.objGraph.DrawText(Text,Color.Black,this.mTextFont,p1.X,p1.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; } } #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)- 科技行者