|
|
Posted on
2004-12-08 12:56
冷风.net
阅读( 523)
评论()
收藏
举报
//*************************************************************************************************
//完成日期: 2004-11-13
//作者: 何利民
//程序功能: 繪制餅狀圖表
//*************************************************************************************************
using System;
using System.Drawing;
using System.Drawing.Text;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using System.ComponentModel;
namespace ImagesSpaceName
  {
public class DrawEllipse : ImageArea
 {
 定義類變量#region 定義類變量
protected string _pictureTitle = "冷風.net制作"; //圖片標題
protected string _pictureTitleColor = "#000000"; //圖片標題顏色
protected string _pictureTitleFamily = "新細明體"; //圖片標題字體名稱
protected int _pictureTitleSize = 14; //圖片標題大小
protected ImagesSpaceName.Valign _pictureTitleValign = ImagesSpaceName.Valign.top; //圖片標題顯示垂直方向位置
protected ImagesSpaceName.Align _pictureTitleAlign = ImagesSpaceName.Align.center; //圖片標題顯示橫向位置
protected bool _smallShow = true; //是否顯示右上角小矩形
protected int _smallWidth = 20; //右上角小矩形的寬度
protected int _smallHeight = 10; //右上角小矩形的高度
#endregion
 初使化購造函數#region 初使化購造函數
public DrawEllipse()
 {
}
#endregion
 定義屬性#region 定義屬性
[
Bindable(true),
Category("drawing"),
DefaultValue(ImagesSpaceName.WaterTitle.bottom),
Description("獲得或設置圖標標題")
]
public virtual string PictureTitle
 {
 get {return _pictureTitle;}
 set {_pictureTitle = value;}
}
[
Bindable(true),
Category("drawing"),
DefaultValue(ImagesSpaceName.WaterTitle.bottom),
Description("獲得或設置圖標標題顏色")
]
public virtual string PictureTitleColor
 {
 get {return _pictureTitleColor;}
 set {_pictureTitleColor = value;}
}
[
Bindable(true),
Category("drawing"),
DefaultValue(ImagesSpaceName.WaterTitle.bottom),
Description("獲得或設置圖標標題字體名稱")
]
public virtual string PictureTitleFamily
 {
 get {return _pictureTitleFamily;}
 set {_pictureTitleFamily = value;}
}
[
Bindable(true),
Category("drawing"),
DefaultValue(ImagesSpaceName.WaterTitle.bottom),
Description("獲得或設置圖標標題大小")
]
public virtual int PictureTitleSize
 {
 get {return _pictureTitleSize;}
 set {_pictureTitleSize = value;}
}
[
Bindable(true),
Category("drawing"),
DefaultValue(ImagesSpaceName.WaterTitle.bottom),
Description("獲得或設置圖標標題垂直對齊")
]
public virtual ImagesSpaceName.Valign PictureTitleValign
 {
 get {return _pictureTitleValign;}
 set {_pictureTitleValign = value;}
}
[
Bindable(true),
Category("drawing"),
DefaultValue(ImagesSpaceName.WaterTitle.bottom),
Description("獲得或設置圖標標題水平對齊")
]
public virtual ImagesSpaceName.Align PictureTitleAlign
 {
 get {return _pictureTitleAlign;}
 set {_pictureTitleAlign = value;}
}
[
Bindable(true),
Category("drawing"),
DefaultValue(ImagesSpaceName.WaterTitle.bottom),
Description("獲得或設置右上角小矩形的寬度")
]
public virtual int SmallWidth
 {
 get {return _smallWidth;}
 set {_smallWidth = value;}
}
[
Bindable(true),
Category("drawing"),
DefaultValue(ImagesSpaceName.WaterTitle.bottom),
Description("獲得或設置右上角小矩形的高度")
]
public virtual int SmallHeight
 {
 get {return _smallHeight;}
 set {_smallHeight = value;}
}
[
Bindable(true),
Category("drawing"),
DefaultValue(ImagesSpaceName.WaterTitle.bottom),
Description("獲得或設置右上角小矩形顯示與否")
]
public virtual bool SmallShow
 {
 get {return _smallShow;}
 set {_smallShow = value;}
}
#endregion
 繪制標題 void DrawTitle()#region 繪制標題 void DrawTitle()
private void DrawTitle()
 {
int x = 0;
int y = 0;
graphics.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
Font font = new Font(PictureTitleFamily,PictureTitleSize);
SizeF sizeF = graphics.MeasureString(PictureTitle,font);
if(PictureTitleValign==ImagesSpaceName.Valign.bottom)
y = (int)Height- (int)sizeF.Height;
if(PictureTitleAlign==ImagesSpaceName.Align.center)
x = ((int)Width-(int)sizeF.Width)/2;
else if(PictureTitleAlign==ImagesSpaceName.Align.right)
x = (int)Width-(int)sizeF.Width;
graphics.DrawString(PictureTitle,font,new SolidBrush(ColorTranslator.FromHtml(PictureTitleColor)),x,y);
}
#endregion
 繪制右上角的小矩形#region 繪制右上角的小矩形
 /**//// <param name="arrayX">橫坐標數據</param>
private void DrawSmallRectangle(string[] arrayX)
 {
Point pos = new Point((int)Width-Margin_Right,Margin_Top); //取得基點
Pen pen = new Pen(new SolidBrush(Color.Black),1);
Font font = new Font("新細明體",12);
int posY = pos.Y;
for(int i=0; i<arrayX.Length; i++)
 {
graphics.DrawRectangle(pen,pos.X,posY,SmallWidth,SmallHeight);
Color color = GetColor(i);
graphics.FillRectangle(new SolidBrush(color),pos.X,posY,SmallWidth,SmallHeight);
graphics.DrawString(arrayX[i],font,new SolidBrush(color),pos.X+SmallWidth+5,posY);
posY += SmallHeight+20;
}
}
#endregion
 旋轉指定的字體void RotateFont(string, int, int, int)#region 旋轉指定的字體void RotateFont(string, int, int, int)
private Bitmap RotateFont(string str, int du, int w, int h)
 {
Bitmap b = new Bitmap(w,h);
Graphics g = Graphics.FromImage(b);
g.Clear(Color.Black);
g.SmoothingMode = SmoothingMode.AntiAlias;
g.RotateTransform(du);
Brush brush=Brushes.Red;
Font font = new Font("宋体", 14);
g.DrawString(str,font,brush,0,0);
g.ResetTransform();
b.MakeTransparent(Color.Black);
return b;
}
#endregion
 繪圖#region 繪圖
 /**//// <param name="arrayX">橫坐標數據</param>
/// <param name="arrayY">昱坐標數據</param>
private void Drawing(string[] arrayX, int[] arrayY)
 {
if(BgGround==null)
 {
bitmap = new Bitmap((int)Width,(int)Height);
graphics = Graphics.FromImage(bitmap);
graphics.Clear(ColorTranslator.FromHtml(BgColor));
}
else
 {
Bitmap img = new Bitmap(BgGround);
if(BgGroundAlpha<250) img = ImageAlpha(img,ColorTranslator.FromHtml(BgColor),BgGroundAlpha);
bitmap = new Bitmap(img,(int)Width,(int)Height);
graphics = Graphics.FromImage(bitmap);
}
SetDrawArea(); //設置繪圖區
DrawingRuler(); //顯示坐標
DrawingGrid(arrayY);//繪制網格
DrawTitle(); //繪制標題
if(SmallShow) DrawSmallRectangle(arrayX); //繪制右上角小圖標
//繪扇形
float iTotalValues = 0; //共多少值
float iCurAngle=0; //當前度數
float iStartAngle = 0; //開始位置
int iXlen =(int)Width-Margin_Right-Margin_Left; //繪制的扇形所在的矩形寬
int iYlen = (int)Height-Margin_Top-Margin_Bottom; //繪制的扇形所在的矩形高
for(int i=0; i<arrayY.Length; i++)
 {
iTotalValues += arrayY[i];
}
for(int i=0; i<arrayY.Length; i++)
 {
iCurAngle = arrayY[i]/iTotalValues*360;
graphics.FillPie(new SolidBrush(GetColor(i)),Margin_Left,Margin_Top,iXlen,iYlen,iStartAngle,iCurAngle);
graphics.DrawPie(Pens.Black,Margin_Left,Margin_Top,iXlen,iYlen,iStartAngle,iCurAngle);
//Bitmap b = RotateFont(arrayX[i],(int)(iStartAngle),iXlen,iYlen);
//Rectangle rec = new Rectangle(MarginLeft,MarginTop,iXlen,iYlen);
//graphics.DrawImage(b,rec,0,0,iXlen,iYlen,GraphicsUnit.Pixel);
iStartAngle += iCurAngle;
}
 /**//*
iCurAngle=0; //當前度數
iStartAngle = 0; //開始位置
for(int i=0; i<arrayY.Length; i++)
{
iCurAngle = arrayY[i]/iTotalValues*360;
Bitmap b = RotateFont(arrayX[i],(int)(iStartAngle),iXlen,iYlen);
Rectangle rec = new Rectangle(Margin_Left+iXlen/2,Margin_Top+iYlen/2,iXlen/2,iYlen/2);
graphics.DrawImage(b,rec,0,0,iXlen/2,iYlen/2,GraphicsUnit.Pixel);
iStartAngle += iCurAngle;
iStartAngle += iCurAngle;
}
*/
if(Alpha<250) bitmap = ImageAlpha(bitmap,ColorTranslator.FromHtml(BgColor),Alpha);
this.SaveImage(bitmap,ImageFormat.Jpeg);
}
#endregion
 調用#region 調用
 /**//// <param name="arrayX">橫坐標數據</param>
/// <param name="arrayY">昱坐標數據</param>
public void CreateEllipse(string[] arrayX, int[] arrayY)
 {
Drawing(arrayX,arrayY);
}
 /**//// <param name="table">數據表</param>
/// <param name="x">X軸數據在數據表中的字段序號</param>
/// <param name="y">Y軸數據在數據表中的字段序號</param>
public void CreateEllipse(System.Data.DataTable table, int x, int y)
 {
try
 {
int iMax = table.Rows.Count;
string[] arrayX = new string[iMax];
int[] arrayY = new int[iMax];
for(int i=0; i<iMax; i++)
 {
arrayX[i] = table.Rows[i][x].ToString();
arrayY[i] = (int)float.Parse(table.Rows[i][y].ToString());
}
Drawing(arrayX,arrayY);
}
catch
 {
throw new Exception("提供數據表中的數據不對!");
}
}
 /**//// <param name="collection">集合</param>
public void CreateEllipse(System.Collections.Specialized.NameValueCollection collection)
 {
try
 {
int iMax = collection.Count;
string[] arrayX = new string[iMax];
int[] arrayY = new int[iMax];
for(int i=0; i<iMax; i++)
 {
arrayX[i] = collection.GetKey(i).ToString();
arrayY[i] = (int)float.Parse(collection.GetValues(i).ToString());
}
Drawing(arrayX,arrayY);
}
catch
 {
throw new Exception("提供集合中的數據表不對!");
}
}
 /**//// <param name="ht">哈希表</param>
public void CreateEllipse(System.Collections.Hashtable ht)
 {
try
 {
int iMax = ht.Count;
string[] arrayX = new string[iMax];
int[] arrayY = new int[iMax];
System.Collections.IDictionaryEnumerator myEnumerator = ht.GetEnumerator();
int i = 0;
while(myEnumerator.MoveNext())
 {
arrayX[i] = myEnumerator.Key.ToString();
arrayY[i] = (int)float.Parse(myEnumerator.Value.ToString());
i++;
}
Drawing(arrayX,arrayY);
}
catch
 {
throw new Exception("提Hashtable中的數據不對!");
}
}
#endregion
}
}
|