using System;
using System.Collections;
using System.Drawing;
using System.Drawing.Imaging;
namespace Ktest
{
/// <summary>
/// Kbuilder 的摘要说明。
/// </summary>
public class Kbuilder
{
private int bottomMarge=10;
private int leftMarge=20;
/// <summary>
/// 默认宽度
/// </summary>
private int m_width=640;
/// <summary>
/// 高度默认400像素
/// </summary>
private int m_height=480;
/// <summary>
/// 默认显示30天数据
/// </summary>
private int m_lineCount=30;
/// <summary>
/// 默认显示的最高价50元
/// </summary>
private int m_maxPrice=50;
/// <summary>
/// 存放价格表
/// </summary>
private ArrayList m_prices;
public Kbuilder()
{
m_prices=new ArrayList();
}
/// <summary>
/// 宽度
/// </summary>
public int Width
{
get
{
return m_width;
}
set
{
m_width=value;
}
}
/// <summary>
/// 高度
/// </summary>
public int Height
{
get
{
return m_height;
}
set
{
m_height=value;
}
}
/// <summary>
/// 显示线数
/// </summary>
public int LineCount
{
get
{
return m_lineCount;
}
set
{
m_lineCount=value;
}
}
public int MaxPrice
{
get
{
return m_maxPrice;
}
set
{
m_maxPrice=value;
}
}
/// <summary>
/// 添加价格
/// </summary>
/// <param name="openPrice">开盘价</param>
/// <param name="maxPrice">最高价</param>
/// <param name="minPrice">最低价</param>
/// <param name="closePrice">收盘价</param>
public void Add(double openPrice,double maxPrice,double minPrice,double closePrice)
{
Ktest.Price a=new Price();
a.Open=openPrice;
a.Max=maxPrice;
a.Min=minPrice;
a.Close=closePrice;
if (m_prices.Count>=m_lineCount)
{
m_prices.RemoveAt(0);
}
m_prices.Add(a);
}
/// <summary>
/// 画图
/// </summary>
/// <returns></returns>
public Bitmap GetImage()
{
Bitmap image = new Bitmap(m_width,m_height);
Graphics g = Graphics.FromImage(image);
Pen black1=new Pen(Color.Black,1);
Pen black2=new Pen(Color.Black,2);
Pen red=new Pen(Color.Red,1);
Point o=new Point(leftMarge,m_height-bottomMarge);
Point y=new Point(leftMarge,0);
Point x=new Point(m_width,m_height-bottomMarge);
Font font=new Font("宋体",8);
int hStep=(m_height-bottomMarge)/m_maxPrice;
int wStep=(m_width-leftMarge)/m_lineCount;
g.Clear(Color.White);
g.DrawLine(black2,y,o);
g.DrawLine(black2,o,x);
for(int i=1;i<=m_maxPrice;i++)
{
g.DrawString(i.ToString(),font,Brushes.Black,1,m_height-bottomMarge-hStep*i);
}
for(int i=1;i<=m_lineCount;i++)
{
g.DrawString(i.ToString(),font,Brushes.Black,wStep*i,m_height-bottomMarge+1);
}
g.Save();
int iCount=0;
foreach(Price p in m_prices)
{
int x1,x2,x3,y1,y2,y3,y4;
x1=leftMarge+iCount*wStep+3;
x2=x1-3+(int)wStep/2;
x3=(leftMarge+wStep*iCount++)-2;
y1=m_height-bottomMarge-(int)p.Max*hStep;
y4=m_height-bottomMarge-(int)p.Min*hStep;
System.Drawing.Brush brush;
Pen curPen;
if (p.Positive)
{
curPen=red;
brush=System.Drawing.Brushes.Red;
y3=m_height-bottomMarge-(int)p.Open*hStep;
y2=m_height-bottomMarge-(int)p.Close*hStep;
}
else
{
curPen=black1;
brush=System.Drawing.Brushes.Black;
y2=m_height-bottomMarge-(int)p.Open*hStep;
y3=m_height-bottomMarge-(int)p.Close*hStep;
}
g.FillRectangle(brush,x1,y2,wStep-5,y3-y2);
g.DrawLine(curPen,x2,y1,x2,y4);
}
return image;
}
}
}