RaUI/Source/ryControls/ImageChart/MovementPainterBase.cs
2020-11-28 15:03:57 +08:00

152 lines
4.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
namespace TChart.ImageChart
{
/// <summary>
/// 作图器的基础类
/// </summary>
/// <remarks>
/// 作者: Kingthy
/// 日期: 2007-09-11
/// MSN: Kingthy@gmail.com
/// 转载请注明原作者,当你有更新修改时如果方便的希望能发一份给我.谢谢
/// </remarks>
public abstract class MovementPainterBase
{
/// <summary>
///
/// </summary>
/// <param name="image"></param>
public MovementPainterBase(MovementImage image)
{
this.m_Image = image;
}
private MovementImage m_Image;
/// <summary>
/// 返回此作图器的相关链走势图
/// </summary>
public MovementImage Image
{
get
{
return m_Image;
}
set
{
m_Image = value;
}
}
#region
/// <summary>
/// 获取某值在Y轴上的位置
/// </summary>
/// <param name="value">当前点的值</param>
/// <returns>点坐标</returns>
protected int GetYPosition(decimal value)
{
//取得Y轴坐标为0的位置
int y = Image.Height - Image.YSpaceWidth;
//取得Y轴的总高度
int h = Image.Height - Image.YSpaceWidth * 2;
//取得比率
int percent = 0;
if (Image.XAxisMaxValue != 0)
{
percent = (int)((value / Image.XAxisMaxValue) * h);
}
return y - percent;
}
#endregion
/// <summary>
/// 画XY轴线
/// </summary>
/// <param name="graphics">画布</param>
/// <param name="xAxes">X轴的数据</param>
public virtual void DrawXYAxisLine(System.Drawing.Graphics graphics, XAxisItemList xAxes)
{
int i, p, h;
StringFormat format = new StringFormat
{
Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center
};
int tmpXSpaceWidth;
//tmpXSpaceWidth = Image.XSpaceWidth;
tmpXSpaceWidth = Image.Xspace;
//画Y轴线
Point p1 = new Point(tmpXSpaceWidth, Image.YSpaceWidth);
Point p2 = new Point(tmpXSpaceWidth, Image.Height - Image.YSpaceWidth);
graphics.DrawLine(new Pen(Image.YAxisColor), p1, p2);
//画等分线[Y轴默认为10等分]
h = (p2.Y - p1.Y) / 10; //等分线的间距
//0和10不画线
for (i = 1; i <= 9; i++)
{
p = p1.Y + h * i;
graphics.DrawLine(new Pen(Image.YAxisColor), new Point(p1.X - 3, p), new Point(p1.X, p));
}
//画X轴线
//点[X = 左右间距 + X轴列的间距总数, Y = 图片高度 - Y轴间距]
Point p3 = new Point(Image.XSpaceWidth * xAxes.Count + tmpXSpaceWidth * 2, Image.Height - Image.YSpaceWidth);
graphics.DrawLine(new Pen(Image.XAxisColor), p2, p3);
//画等分线
for (i = 1; i <= xAxes.Count; i++)
{
p = p1.X + Image.XSpaceWidth * i;
//重置p3点
p3.X = p;
p3.Y = p2.Y + 3;
graphics.DrawLine(new Pen(Image.XAxisColor), new Point(p, p2.Y), p3);
//添加X轴标题
p3.Y = p2.Y + Image.YSpaceWidth / 2;
XAxisItem item = xAxes[i - 1];
if (item != null && !string.IsNullOrEmpty(item.Title))
{
graphics.DrawString(item.Title, item.TitleFont, new SolidBrush(item.TitleColor), p3, format);
}
}
}
/// <summary>
/// 画标题
/// </summary>
/// <param name="graphics"></param>
public virtual void DrawTitle(System.Drawing.Graphics graphics)
{
StringFormat format = new StringFormat
{
Alignment = StringAlignment.Near,
LineAlignment = StringAlignment.Near
};
if (!string.IsNullOrEmpty(Image.Title))
{
graphics.DrawString(Image.Title, Image.TitleFont, new SolidBrush(Image.TitleColor), new Point(3,3), format);
}
}
/// <summary>
/// 画走势线
/// </summary>
/// <param name="graphics">画布</param>
/// <param name="xAxes">X轴数据</param>
public abstract void DrawValue(System.Drawing.Graphics graphics, XAxisItemList xAxes);
}
}