用下列代码替换 PDAChartControlControl.cs 中的代码:
//***************************************************************************** //
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 |
3.
在解决方案资源管理器中,右击"引用",然后单击"添加引用"。
4.
在"添加引用"对话框中的".NET"选项卡上,单击"System.Drawing",然后单击"选择"。
"System.Drawing"会出现在"选定的组件"下。
5. 对"System.Windows.Forms"重复步骤
4 并单击"确定"。
"System.Drawing"和"System.Windows.Forms"都会出现在解决方案资源管理器的"引用"下。
6. 在"生成"菜单上,单击"生成解决方案"。
将生成控件 PDAChartControlControl.dll
的运行时版本并将其放在目录 Projects_Directory\PDAChartControlContro\bin\Debug\ 中。
7. 在"文件"菜单中,单击"关闭解决方案"。
由于生成了控件的运行时版本,接下来可以为设计器支持生成设计时版本。
|