#region 枚舉相關變量
/// <summary>
/// 統計方式[X軸的刻度信息]
/// </summary>
public enum StatType:int
{
/// <summary>
/// 按星期統計
/// </summary>
Week = 7,
/// <summary>
/// 按月統計
/// </summary>
Month = 12,
/// <summary>
/// 自定義方式
/// </summary>
Custom 
} /// <summary>
/// 作圖方式
/// </summary>
public enum EffectType:int
{
///<summary>
///曲線圖
///<summary>
Line = 0,
///<summary>
///柱狀圖
///<summary>
Bar = 1
} #endregion #region 統計圖返回image對像
/// <summary>
/// 統計圖返回image對像
/// </summary>
/// <param name="ChartType">統計方式[提供月,周統計]</param>
/// <param name="ChartEffact">畫圖效果[曲線圖,柱狀圖]</param>
/// <param name="sXScale">X軸的刻度標題</param>
/// <param name="Param">統計內容[二維數組]</param>
/// <returns></returns>
public Image RetImageChart(Draw.StatType ChartType,Draw.EffectType ChartEffact,string [] sXScale,params float[][] ArrayData)
{
if(ArrayData == null)
{
throw(new Exception("錯誤:\r\n\r\n無數據進行做圖,請提供正確的數據!"));
}
if(ArrayData.Length > 10 && _ColorLine.Length == 10)
{
throw(new Exception("錯誤:\r\n\r\n系統只提供'10'種顏色做圖,系統檢測到做圖的線條多於'10'條,請重新指定更多的顏色!"));
}
else if(ArrayData.Length > 10 && _ColorLine.Length < ArrayData.Length)
{
throw(new Exception("錯誤:\r\n\r\n系統檢測到做圖所需顏色數量大於所提供顏色的數量!"));
}
//計算出Y軸的最大值及最小值
_yMax = MaxValue(ArrayData); _yMin = MinValue(ArrayData);
//計算出數據中X軸的最大值
_xMax = (float)XMaxValue(ArrayData);
//建立基本信息[坐標及網格]
Bitmap bmp = GetBimap(_xMax,_xMin,_yMax,_yMin,ChartType,ChartEffact);
//選擇顏色起始值
int i = 0 ;
//畫出所有的線
foreach(float[] LineValue in ArrayData)
{
//取得自定義中的顏色
Color LineColor = ColorTranslator.FromHtml(_ColorLine[i]);

bmp = DrawEffect(ChartType,ChartEffact,LineColor,bmp,LineValue); i++;
}
//添加標題及信息
bmp = GetBimap(bmp,ArrayData);
//返加Image對像;
            return (Image)bmp; }
#endregion #region 計算出Y軸最大值及最小值
/// <summary>
/// 計算出Y軸的最大值
/// </summary>
/// <param name="Values">作圖數據</param>
/// <returns></returns>
private float MaxValue(params float[][] Values)
{
float fMax = Values[0][0];
foreach(float[] fData in Values)
{
foreach(float fTem in fData)
{
if(fTem>fMax)
{
fMax = fTem;
}
}
}
return fMax;
} /// <summary>
/// 計算出Y軸最小值
/// </summary>
/// <param name="Values">作圖數據</param>
/// <returns></returns>
private float MinValue(params float[][] Values)
{
float fMin = Values[0][0];
foreach(float[] fData in Values)
{
foreach(float fTem in fData)
{
if(fTem<fMin)
{
fMin = fTem;
}
}
}
return fMin;
}
#endregion

解决方案 »

  1.   

    #region 度算出X的最大值
    /// <summary>
    /// 計算出數據中X軸的最大值
    /// </summary>
    /// <param name="Values">作圖數據</param>
    /// <returns></returns>
    private int XMaxValue(params float[][] Values)
    {
    int nLength = Values[0].Length;
    foreach(float[] fTem in Values)
    {
    if(fTem.Length > nLength)
    {
    nLength = fTem.Length;
    }
    }
    return nLength;
    }
    #endregion #region 添加圖示信息
    /// <summary>
    /// 添加標題及圖示
    /// </summary>
    /// <param name="EffectImage">添加圖示的圖片對像</param>
    /// <param name="ValuesLenth">判斷需添加多少圖示</param>
    /// <returns></returns>
    private Bitmap GetBimap(Bitmap EffectImage,params float[][] ValuesLenth)
    {
    //設置字體的刷筆樣式及顏色
    SolidBrush titleBrush = new SolidBrush(_ColorTitle);
    //設置作圖的大小及樣式
    Bitmap bmp = new Bitmap(_Width+50,_Height+80,System.Drawing.Imaging.PixelFormat.Format32bppRgb);
    //建立作圖對像
    Graphics g = Graphics.FromImage(bmp);
    //畫出作圖區域
    g.FillRectangle(new SolidBrush(_BackColor),0,0,_Width+50,_Height+80);
    //在指定的區域畫出原來的圖
    g.DrawImageUnscaled(EffectImage,25,80);
    //設置標題為居中顯示
    StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Center;
    //要顯示標題的區域
    RectangleF drawRect = new RectangleF( 0, 25, (_Width+50), (int)g.MeasureString(_sTitle.Substring(0,1),_Font).Height);

    //畫出標題
    g.DrawString(_sTitle,_FontTitle,titleBrush,drawRect,sf);
    //畫出線條的條示
    for(int i = 0;i< ValuesLenth.Length;i++)
    {

    Rectangle newRec = new Rectangle(_Width-25,i*12+10,10,6); g.FillRectangle(new SolidBrush(ColorTranslator.FromHtml(_ColorLine[i])),newRec);
    //判斷是不是手動添加圖示信息
    if(_DrawIco.Length > 0)
    {
    g.DrawString(_DrawIco[i].ToString(),new Font("Arial",8),new SolidBrush(ColorTranslator.FromHtml(_ColorLine[i])),_Width-10,i*12+7);
    }
    else
    {
    g.DrawString("Line-"+i.ToString(),new Font("Arial",8),new SolidBrush(ColorTranslator.FromHtml(_ColorLine[i])),_Width-10,i*10+5);
    }
    } return bmp;

    }
    /// <summary>
    /// 
    /// </summary>
    /// <param name="MaxX">X最大值</param>
    /// <param name="MinX">X最小值</param>
    /// <param name="MaxY">Y最大值</param>
    /// <param name="MinY">Y最小值</param>
    /// <param name="ChartEffact">作圖方式</param>
    /// <param name="ChartType">X軸刻試信息</param>
    /// <returns></returns>
    private Bitmap GetBimap(float MaxX, float MinX, float MaxY, float MinY,Draw.StatType ChartType,Draw.EffectType ChartEffact)
    {
    //"↑→""X,Y標識"的字體
    Font fNotice = new Font("Verdana",9);
    //建立作圖區域
    Bitmap bmp = new Bitmap(_Width,_Height,System.Drawing.Imaging.PixelFormat.Format32bppRgb);
    //建立作圖對像實例
    Graphics g = Graphics.FromImage(bmp);

    //背景
    g.FillRectangle(new SolidBrush(_BackColor),0,0,_Width,_Height);
    //Y軸
    Pen lineXY = new Pen(_XYline);
    //畫Y軸
    g.DrawLine(lineXY,_X,_Height-_Y,_X,20);
    //畫↑
    g.DrawString(Arrowy,fNotice,_Brush,_X-8,10);
    //畫X軸
    g.DrawLine(lineXY,_X,_Height-_Y,_Width-_Y,_Height-_Y);
    //畫"→"
    g.DrawString(Arrowx,fNotice,_Brush,_Width-_Y-1,_Height-_Y-7);
    //標明X,Y標識
    g.DrawString(_strY,fNotice,_Brush,0,0);

    g.DrawString(_strX,fNotice,_Brush,_Width-(_Font.SizeInPoints*_strX.Length)-7,_Height-18);
    //回收資源
    g.Dispose();
    return GetTag(bmp,MaxX,MinX,MaxY,MinY,ChartType,ChartEffact);
                
    } /// <summary>
    /// 設置坐標中的提示信息
    /// </summary>
    /// <param name="oImage">作圖對像</param>
    /// <param name="MaxX"></param>
    /// <param name="MinX"></param>
    /// <param name="MaxY"></param>
    /// <param name="MinY"></param>
    /// <param name="ChartType"></param>
    /// <param name="ChartEffact"></param>
    /// <returns></returns>
    public Bitmap GetTag(Bitmap oImage, float MaxX, float MinX, float MaxY, float MinY,Draw.StatType ChartType,Draw.EffectType ChartEffact)
    {
    //畫刻度的標示字體
    Font Fpoint = new Font("Verdana",10,FontStyle.Bold);
    //建立作圖對像實例
    Graphics g = Graphics.FromImage(oImage);
    //設置作圖品質
    //g.SmoothingMode = SmoothingMode.HighQuality;
    //g.TextRenderingHint = TextRenderingHint.AntiAlias;
    switch (ChartEffact)
    {
    case EffectType.Line:
    if(ChartType == StatType.Custom)
    {
    }
    else
    {
    #region X軸刻度信息
    //X軸Tag顏色及樣式
    Pen TagPen = new Pen(_GridLine);
    TagPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
    //取得有多少數目
    int nCount = (int)ChartType;

    for(int i = 0;i < nCount;i++)
    {
    //計算出刻度坐標值
    float x = ((float)i/(float)nCount)*(_Width-_X)+_X;
    float y = (float)(_Height-_Y-9);
    //畫出坐標點"."
    g.DrawString("·",Fpoint,_Brush,x-5,y);
    //判斷是水平作圖還是垂直作圖
    //Apeak == true 垂直作圖
    if(_Apeak == true)
    {
    //畫出刻度內容
    g.DrawString((i+1).ToString(),_Font,_Brush,x-4,y+10,new StringFormat(StringFormatFlags.DirectionVertical));
    }
    else
    {
    //畫出刻度內容
    g.DrawString((i+1).ToString(),_Font,_Brush,x-4,y+10);
    }
    //網格線X軸
    if(i > 0 && _BackGround == true)
    {
    g.DrawLine(TagPen,x,y+7,x,10);
    }
    }
    #endregion
      

  2.   

    #region 度算出X的最大值
    /// <summary>
    /// 計算出數據中X軸的最大值
    /// </summary>
    /// <param name="Values">作圖數據</param>
    /// <returns></returns>
    private int XMaxValue(params float[][] Values)
    {
    int nLength = Values[0].Length;
    foreach(float[] fTem in Values)
    {
    if(fTem.Length > nLength)
    {
    nLength = fTem.Length;
    }
    }
    return nLength;
    }
    #endregion #region 添加圖示信息
    /// <summary>
    /// 添加標題及圖示
    /// </summary>
    /// <param name="EffectImage">添加圖示的圖片對像</param>
    /// <param name="ValuesLenth">判斷需添加多少圖示</param>
    /// <returns></returns>
    private Bitmap GetBimap(Bitmap EffectImage,params float[][] ValuesLenth)
    {
    //設置字體的刷筆樣式及顏色
    SolidBrush titleBrush = new SolidBrush(_ColorTitle);
    //設置作圖的大小及樣式
    Bitmap bmp = new Bitmap(_Width+50,_Height+80,System.Drawing.Imaging.PixelFormat.Format32bppRgb);
    //建立作圖對像
    Graphics g = Graphics.FromImage(bmp);
    //畫出作圖區域
    g.FillRectangle(new SolidBrush(_BackColor),0,0,_Width+50,_Height+80);
    //在指定的區域畫出原來的圖
    g.DrawImageUnscaled(EffectImage,25,80);
    //設置標題為居中顯示
    StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Center;
    //要顯示標題的區域
    RectangleF drawRect = new RectangleF( 0, 25, (_Width+50), (int)g.MeasureString(_sTitle.Substring(0,1),_Font).Height);

    //畫出標題
    g.DrawString(_sTitle,_FontTitle,titleBrush,drawRect,sf);
    //畫出線條的條示
    for(int i = 0;i< ValuesLenth.Length;i++)
    {

    Rectangle newRec = new Rectangle(_Width-25,i*12+10,10,6); g.FillRectangle(new SolidBrush(ColorTranslator.FromHtml(_ColorLine[i])),newRec);
    //判斷是不是手動添加圖示信息
    if(_DrawIco.Length > 0)
    {
    g.DrawString(_DrawIco[i].ToString(),new Font("Arial",8),new SolidBrush(ColorTranslator.FromHtml(_ColorLine[i])),_Width-10,i*12+7);
    }
    else
    {
    g.DrawString("Line-"+i.ToString(),new Font("Arial",8),new SolidBrush(ColorTranslator.FromHtml(_ColorLine[i])),_Width-10,i*10+5);
    }
    } return bmp;

    }
    /// <summary>
    /// 
    /// </summary>
    /// <param name="MaxX">X最大值</param>
    /// <param name="MinX">X最小值</param>
    /// <param name="MaxY">Y最大值</param>
    /// <param name="MinY">Y最小值</param>
    /// <param name="ChartEffact">作圖方式</param>
    /// <param name="ChartType">X軸刻試信息</param>
    /// <returns></returns>
    private Bitmap GetBimap(float MaxX, float MinX, float MaxY, float MinY,Draw.StatType ChartType,Draw.EffectType ChartEffact)
    {
    //"↑→""X,Y標識"的字體
    Font fNotice = new Font("Verdana",9);
    //建立作圖區域
    Bitmap bmp = new Bitmap(_Width,_Height,System.Drawing.Imaging.PixelFormat.Format32bppRgb);
    //建立作圖對像實例
    Graphics g = Graphics.FromImage(bmp);

    //背景
    g.FillRectangle(new SolidBrush(_BackColor),0,0,_Width,_Height);
    //Y軸
    Pen lineXY = new Pen(_XYline);
    //畫Y軸
    g.DrawLine(lineXY,_X,_Height-_Y,_X,20);
    //畫↑
    g.DrawString(Arrowy,fNotice,_Brush,_X-8,10);
    //畫X軸
    g.DrawLine(lineXY,_X,_Height-_Y,_Width-_Y,_Height-_Y);
    //畫"→"
    g.DrawString(Arrowx,fNotice,_Brush,_Width-_Y-1,_Height-_Y-7);
    //標明X,Y標識
    g.DrawString(_strY,fNotice,_Brush,0,0);

    g.DrawString(_strX,fNotice,_Brush,_Width-(_Font.SizeInPoints*_strX.Length)-7,_Height-18);
    //回收資源
    g.Dispose();
    return GetTag(bmp,MaxX,MinX,MaxY,MinY,ChartType,ChartEffact);
                
    } /// <summary>
    /// 設置坐標中的提示信息
    /// </summary>
    /// <param name="oImage">作圖對像</param>
    /// <param name="MaxX"></param>
    /// <param name="MinX"></param>
    /// <param name="MaxY"></param>
    /// <param name="MinY"></param>
    /// <param name="ChartType"></param>
    /// <param name="ChartEffact"></param>
    /// <returns></returns>
    public Bitmap GetTag(Bitmap oImage, float MaxX, float MinX, float MaxY, float MinY,Draw.StatType ChartType,Draw.EffectType ChartEffact)
    {
    //畫刻度的標示字體
    Font Fpoint = new Font("Verdana",10,FontStyle.Bold);
    //建立作圖對像實例
    Graphics g = Graphics.FromImage(oImage);
    //設置作圖品質
    //g.SmoothingMode = SmoothingMode.HighQuality;
    //g.TextRenderingHint = TextRenderingHint.AntiAlias;
    switch (ChartEffact)
    {
    case EffectType.Line:
    if(ChartType == StatType.Custom)
    {
    }
    else
    {
    #region X軸刻度信息
    //X軸Tag顏色及樣式
    Pen TagPen = new Pen(_GridLine);
    TagPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
    //取得有多少數目
    int nCount = (int)ChartType;

    for(int i = 0;i < nCount;i++)
    {
    //計算出刻度坐標值
    float x = ((float)i/(float)nCount)*(_Width-_X)+_X;
    float y = (float)(_Height-_Y-9);
    //畫出坐標點"."
    g.DrawString("·",Fpoint,_Brush,x-5,y);
    //判斷是水平作圖還是垂直作圖
    //Apeak == true 垂直作圖
    if(_Apeak == true)
    {
    //畫出刻度內容
    g.DrawString((i+1).ToString(),_Font,_Brush,x-4,y+10,new StringFormat(StringFormatFlags.DirectionVertical));
    }
    else
    {
    //畫出刻度內容
    g.DrawString((i+1).ToString(),_Font,_Brush,x-4,y+10);
    }
    //網格線X軸
    if(i > 0 && _BackGround == true)
    {
    g.DrawLine(TagPen,x,y+7,x,10);
    }
    }
    #endregion