/*============================================================================*/
/*                                                                            */
/*                            C O P Y R I G H T                               */
/*                                                                            */
/*                       (C) Copyright 2006-2020 by                           */
/*                              Yang Guojun                                   */
/*                           All Rights Reserved                              */
/*                                                                            */
/*      The author assumes no responsibility for the use or reliability of    */
/*      his software.                                                         */
/*                                                                            */
/*============================================================================*/
////////////////////////////////////////////////////////////////////////////////
//                                  版权申明                                  //
//                         版权所有(C)2006-2020，杨国君                       //
//                                保留所有权利                                //
////////////////////////////////////////////////////////////////////////////////
/* ############################################################################################################################## */

#pragma once
#include <windows.h>
#include <time.h>

namespace NsCChart{
	
//用于动态链接库的时候，注释掉#else中的第二行
//用于静态库或者源码时，注释掉#else中的第一行
#ifdef CKCandleChart_EXPORTS
#define CKCandleChart_API __declspec(dllexport)
#else
#define CKCandleChart_API __declspec(dllimport)
//#define CKCandleChart_API
#endif

class	CKCandleChart_API	CKCandleChart
{
public:	
	// CKCandleChart内部数据结构
	struct stKCandleChartPara;
	// 获得内部数据的指针
	stKCandleChartPara	*GetPara();
protected:
	// 内部数据
	stKCandleChartPara	*m_pPara;
	// 释放内部资源
	void		Release();	
	
public:
	CKCandleChart();
	~CKCandleChart();


	// 获得标识符，架构所需
	int			GetPlotID();
	// 设置标识符，架构所需
	void		SetPlotID(int nID);
public:
	// 获得预置窗口
	HWND		GetWnd();
	// 设置预置窗口
	void		SetWnd(HWND hWnd);
	// 测试是否限制绘图区
	bool		IsRectConfined();
	// 设置是否限制绘图区
	void		SetRectConfined(bool confine);
	// 获取限制区域
	RECT		GetConfineRect(); 
	// 设置限制区域
	void		SetConfineRect(RECT ConfineRect);
	
	// 测试内部是否无数据
	bool		IsEmpty();

public:
	// 对SetWnd()设置的窗口句柄绘图
	void		OnDraw();
	// 对窗口句柄绘图
	void		OnDraw(HWND hWnd);
	// 对设备上下文绘图
	void		OnDraw(HDC hDC);
	// 在窗口上选择区域绘图
	void		OnDraw(HWND hWnd, RECT destRect);
	// 在设备上下文对应的窗口上，选择区域绘图
	void		OnDraw(HDC hDC, RECT destRect);

public:
	// 测试是否响应鼠标键盘消息
	bool		IsReact();
	// 设置是否响应鼠标键盘消息
	void		SetReact(bool react);
	// 单个的鼠标键盘消息，但不重绘，由用户根据返回值重绘
	bool		OnLButtonDown( HWND hWnd, POINT point, UINT ctrlKey );
	bool		OnLButtonUp( HWND hWnd, POINT point, UINT ctrlKey );
	bool		OnLButtonDblClk( HWND hWnd, POINT point, UINT ctrlKey );
	bool		OnMouseMove( HWND hWnd, POINT point, UINT ctrlKey );
	bool		OnMouseLeave( HWND hWnd, POINT point, UINT ctrlKey );
	bool		OnContextMenu( HMENU hMenu, HWND hWnd, POINT point );
	bool		OnKeyDown( HWND hWnd, UINT key );
	// 响应消息，但不重绘，由用户根据返回值重绘
	bool		OnEvent(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
	// 响应消息，在AutoRedraw为真情况下重绘
	void		Interactive(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

public:
	// 设置标题
	void		SetTitle(TCHAR* title);
	// 设置标题是否显示
	void		SetTitleShow(bool show);
	// 设置标题颜色
	void		SetTitleColor(COLORREF color);
	// 设置标题字体
	void		SetTitleFont(LOGFONT logFont);
	// 设置标题字体高度
	void		SetTitleHeight(int height);
	// 设置标题字体名称
	void		SetTitleFaceName(TCHAR* facename);

	// 获得背景颜色
	COLORREF	GetBkgndColor();
	// 设置背景颜色
	void		SetBkgndColor(COLORREF color);
	// 设置是否绘制边缘
	void		SetEdgeShow(bool show);

	//以上函数是架构所需函数，必须全部实现
	//后续函数是具体功能函数
	
	// 设置各边保留宽度
	void		SetReservedMarginLeft(int margin);
	void		SetReservedMarginRight(int margin);
	void		SetReservedMarginTop(int margin);
	void		SetReservedMarginBottom(int margin);
	
	// 设置图像可以鼠标拖动
	void		SetDragEnable(bool enable);
	
	// 设置蜡烛图X轴数据范围
	void		SetXRange(double low, double high);
	// 设置蜡烛图Y轴数据范围
	void		SetYRange(double low, double high);

public:
	// 添加单个k线
	int			AddCandle(time_t tm0, double fOpen, double fClose, double fLowest, double fHighest, double fVolume, double fAmount);
	// 添加单个k线，日期用字符串输入，其格式为fmt。日期格式参考C库函数strftime
	int			AddCandle(TCHAR* strTime, TCHAR* fmt, double fOpen, double fClose, double fLowest, double fHighest, double fVolume, double fAmount);
	// 添加移动平均线
	void		AddMALine(int nThAvg);
	// 设置移动平均线的线宽
	void		SetMALineSize(int size);

	// 设置Bollinger线的线宽
	void		SetBollingerLineSize(int size);
	// 设置Bollinger线是否显示
	void		SetBollingerLineShow(bool show);

	// 设置横轴的时间显示格式，参考C库函数strftime
	void		SetFmtTime(TCHAR* fmt);

	// 设置K线框是否填充
	void		SetKRiseFill(bool fill);
	void		SetKFallFill(bool fill);
	// 设置K线上涨时颜色
	void		SetKRiseColor(COLORREF cr);
	// 设置K线下跌是颜色
	void		SetKFallColor(COLORREF cr);

	// 设置K线上下端线是否显示
	void		SetEndLineShow(bool show);
	// 设置最高线最低线是否显示
	void		SetPeakLineShow(bool show);

	// 设置k线框部分显示
	void		SetPartiallyShow(bool part);
	// 设置k线框最大显示个数
	void		SetMaxKCandlesShow(int nMaxKCandles);

public:
	// 设置趋势线
	int			SetTrendLine(TCHAR *strTime1, TCHAR *strTime2, TCHAR *fmt, int width, int alpha, COLORREF cr, bool bRise, bool bThrough);
	// 删除趋势线
	void		DeleteTrends();
	// 添加缺口
	int			AddGap(TCHAR *strTime, TCHAR *fmt, int nWidth, bool bWide, COLORREF crEdge, COLORREF crText);
	// 删除缺口
	void		DeleteGaps();
	// 添加买卖标识
	int			AddIOFlag(TCHAR *strTime, TCHAR *fmt, bool bIn, COLORREF crFill, COLORREF crArrow);
	// 删除买卖标识
	void		DeleteIOFlags();

public:
	// 获得是否绘制信息托盘
	bool		IsInfoPadShow();
	// 设置是否绘制信息托盘
	void		SetInfoPadShow(bool show);
	// 获得信息托盘背景颜色
	COLORREF	GetInfoPadBkColor();
	// 设置信息托盘背景颜色
	void		SetInfoPadBkColor(COLORREF color);

public:
	// 设置K线移动时的速度
	void		SetMoveSpeed(float speed);
};

////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
// Declaration of class CKCandleChartWnd

// 窗口类，包装了消息处理函数
class	CKCandleChart_API	CKCandleChartWnd
{
public:
	// CKCandleChartWnd内部所用的数据结构
	struct	stKCandleChartWndPara;
protected:
	// 内部数据
	stKCandleChartWndPara *m_pPara;
	// 释放内部资源
	void	Release();
	
public:
	CKCandleChartWnd();
	~CKCandleChartWnd();
	
public:
	// 根据标识获得序号
	int		GetChartIndex(int nChartID);
	// 根据序号获得标识
	int		GetChartID(int nChartIndex);
	// 获取CKCandleChart类的指针，以调用其函数
	CKCandleChart	*GetChart(int nChartIndex=0);
	// 设置CChart类对象，主要用于子类化，返回值为原CChart类指针
	CKCandleChart	*SetChart(CKCandleChart *pChart, int nChartIndex=0);
	// 获得已Attach的次数
	int		GetChartCount();
	
	// 粘窗口，最基本形式
	int		Attach(HWND hWnd);
	// 粘窗口，同时设置绘图类型，并限制绘图区
	int		Attach(HWND hWnd, RECT rtClient);
	// 粘窗口，粘到对话框上, 给定控件句柄
	int		AttachDlg(HWND hDlg, HWND hCtrl);
	// 粘窗口，粘到对话框上，给定控件ID
	int		AttachDlg(HWND hDlg, UINT nCtrlID);
	// 卸窗口, 所有函数的nChartIndex，均按照成功Attach的顺序依次为0, 1, 2, ...
	bool	Detach();
	bool	Detach(HWND hWnd);
	
	// 重绘
	void	ReDraw();
	void	ReDraw(HWND hWnd);
	void	ReDraw(int nChartIndex);
	void	ReDraw(CKCandleChart *chart);		
};


//////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
// namespace ending
}