389 lines
8.6 KiB
C#
389 lines
8.6 KiB
C#
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Text;
|
|||
|
|
using System.Drawing.Imaging;
|
|||
|
|
using System.Drawing;
|
|||
|
|
using System.IO;
|
|||
|
|
namespace TChart.ImageChart
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>ͼ
|
|||
|
|
/// </summary>
|
|||
|
|
/// <remarks>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>: Kingthy
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>: 2007-09-11
|
|||
|
|
/// MSN: Kingthy@gmail.com
|
|||
|
|
/// ת<><D7AA><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>и<EFBFBD><D0B8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD>ܷ<EFBFBD>һ<EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>.лл
|
|||
|
|
/// </remarks>
|
|||
|
|
public class MovementImage : IDisposable
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
public MovementImage()
|
|||
|
|
{
|
|||
|
|
InitParameter();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#region <EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
private void InitParameter()
|
|||
|
|
{
|
|||
|
|
m_Title = null;
|
|||
|
|
m_Width = 0;
|
|||
|
|
m_Height = 200;
|
|||
|
|
m_Xspace = 4;
|
|||
|
|
m_XSpaceWidth = 30;
|
|||
|
|
m_YSpaceWidth = 30;
|
|||
|
|
m_XAxisMaxValue = 0;
|
|||
|
|
m_TitleColor = Color.Black;
|
|||
|
|
m_TitleFont = new Font(new FontFamily("Arial"), 9, FontStyle.Regular);
|
|||
|
|
m_BackgroundColor = Color.White;
|
|||
|
|
m_XAxisColor = Color.Black;
|
|||
|
|
m_YAxisColor = Color.Black;
|
|||
|
|
m_Painter = new RectanglePainter(this);
|
|||
|
|
m_Picture = null;
|
|||
|
|
}
|
|||
|
|
private int m_Xspace;
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public int Xspace
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return m_Xspace;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
m_Xspace = value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
private string m_Title;
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public string Title
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return m_Title;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
m_Title = value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private int m_Width;
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>ͼƬ<CDBC>Ŀ<EFBFBD><C4BF><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public int Width
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return m_Width;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private int m_Height;
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD><EFBFBD>ͼƬ<CDBC>ĸ߶<C4B8>
|
|||
|
|
/// </summary>
|
|||
|
|
public int Height
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return m_Height;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
m_Height = value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private int m_XSpaceWidth;
|
|||
|
|
/// <summary>
|
|||
|
|
/// X<><58><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public int XSpaceWidth
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return m_XSpaceWidth;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
m_XSpaceWidth = value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private int m_YSpaceWidth;
|
|||
|
|
/// <summary>
|
|||
|
|
/// Y<><59><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public int YSpaceWidth
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return m_YSpaceWidth;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
m_YSpaceWidth = value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private Color m_TitleColor;
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
|
|||
|
|
/// </summary>
|
|||
|
|
public Color TitleColor
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return m_TitleColor;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
m_TitleColor = value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private Font m_TitleFont;
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public Font TitleFont
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return m_TitleFont;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
m_TitleFont = value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private Color m_BackgroundColor;
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
|
|||
|
|
/// </summary>
|
|||
|
|
public Color BackgroundColor
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return m_BackgroundColor;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
m_BackgroundColor = value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private Color m_XAxisColor;
|
|||
|
|
/// <summary>
|
|||
|
|
/// X<><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
|
|||
|
|
/// </summary>
|
|||
|
|
public Color XAxisColor
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return m_XAxisColor;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
m_XAxisColor = value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private Color m_YAxisColor;
|
|||
|
|
/// <summary>
|
|||
|
|
/// Y<><59><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
|
|||
|
|
/// </summary>
|
|||
|
|
public Color YAxisColor
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return m_YAxisColor;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
m_YAxisColor = value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private decimal m_XAxisMaxValue;
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD>ֵ(<28><><EFBFBD><EFBFBD>Painter<65><72><EFBFBD><EFBFBD>)
|
|||
|
|
/// </summary>
|
|||
|
|
public decimal XAxisMaxValue
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return m_XAxisMaxValue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private System.Drawing.Image m_Picture;
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public System.Drawing.Image Picture
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return m_Picture;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
m_Picture = value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
private Graphics m_Graphics;
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD>
|
|||
|
|
private MovementPainterBase m_Painter;
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>ͼ<EFBFBD><CDBC>
|
|||
|
|
/// </summary>
|
|||
|
|
public MovementPainterBase Painter
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return m_Painter;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
m_Painter = value;
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>Ĺ<EFBFBD><C4B9><EFBFBD>ͼ<EFBFBD><CDBC>Ϊ<EFBFBD><CEAA>ǰͼ
|
|||
|
|
if (value != null) m_Painter.Image = this;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region <EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
|
|||
|
|
/// </summary>
|
|||
|
|
public void Dispose()
|
|||
|
|
{
|
|||
|
|
if (m_Picture == null) m_Picture.Dispose();
|
|||
|
|
m_Picture = null;
|
|||
|
|
|
|||
|
|
if (m_Graphics != null) m_Graphics.Dispose();
|
|||
|
|
m_Graphics = null;
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>ȡX<C8A1><58><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="xAxes"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
private decimal GetMaxXAxisValue(XAxisItemList xAxes)
|
|||
|
|
{
|
|||
|
|
if (xAxes.Count == 0) return 0;
|
|||
|
|
|
|||
|
|
decimal max = xAxes[0].Value;
|
|||
|
|
for (int i = 1; i < xAxes.Count; i++)
|
|||
|
|
{
|
|||
|
|
max = Math.Max(max, xAxes[i].Value);
|
|||
|
|
}
|
|||
|
|
return max;
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="list"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
private decimal GetMaxXAxisValue(List<XAxisItemList> list)
|
|||
|
|
{
|
|||
|
|
decimal max = 0;
|
|||
|
|
foreach (XAxisItemList item in list)
|
|||
|
|
{
|
|||
|
|
if (item.Count != 0) max = Math.Max(max, GetMaxXAxisValue(item));
|
|||
|
|
}
|
|||
|
|
return max;
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region <EFBFBD><EFBFBD>ͼ
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>ʼ<EFBFBD><CABC>ͼƬ
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="xAxes">X<><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
private bool InitImage(XAxisItemList xAxes)
|
|||
|
|
{
|
|||
|
|
if (xAxes == null) return false;
|
|||
|
|
if (xAxes.Count == 0) return false;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>(<28><><EFBFBD>Ҿ<EFBFBD> + X<><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> * <20><><EFBFBD><EFBFBD>)
|
|||
|
|
this.m_Width = this.XSpaceWidth * 3 + this.XSpaceWidth * xAxes.Count;
|
|||
|
|
|
|||
|
|
//<2F><>ʼ<EFBFBD><CABC>ͼƬ
|
|||
|
|
m_Picture = new Bitmap(this.Width, this.Height);
|
|||
|
|
m_Graphics = Graphics.FromImage(m_Picture);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>䱳<EFBFBD><E4B1B3>ɫ
|
|||
|
|
m_Graphics.FillRectangle(new SolidBrush(this.BackgroundColor), 0, 0, this.Width, this.Height);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
Painter.DrawTitle(m_Graphics);
|
|||
|
|
|
|||
|
|
//<2F><>X,Y<><59><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
Painter.DrawXYAxisLine(m_Graphics, xAxes);
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="xAxes"></param>
|
|||
|
|
public void Draw(XAxisItemList xAxes)
|
|||
|
|
{
|
|||
|
|
//ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
m_XAxisMaxValue = GetMaxXAxisValue(xAxes);
|
|||
|
|
|
|||
|
|
if (!InitImage(xAxes)) return;
|
|||
|
|
|
|||
|
|
//<2F><>ֵ
|
|||
|
|
Painter.DrawValue(m_Graphics, xAxes);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="list"></param>
|
|||
|
|
public void Draw(List<XAxisItemList> list)
|
|||
|
|
{
|
|||
|
|
if (list == null || list.Count == 0) return;
|
|||
|
|
|
|||
|
|
//ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
m_XAxisMaxValue = GetMaxXAxisValue(list);
|
|||
|
|
|
|||
|
|
XAxisItemList xAxes = list[0];
|
|||
|
|
|
|||
|
|
if (!InitImage(xAxes)) return;
|
|||
|
|
|
|||
|
|
//<2F><>ֵ
|
|||
|
|
foreach (XAxisItemList item in list)
|
|||
|
|
{
|
|||
|
|
Painter.DrawValue(m_Graphics, item);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
}
|
|||
|
|
}
|