#pragma once
#include "TLBase.h"
#include "TLChartTitle.h"
#include "TLChartAxis.h"
#include "TLChartStandardAxis.h"
#include "TLChartSerie.h"
#include "TLChartLegend.h"
#include "TLChartAnnotation.h"
#include <map>
using namespace std;
class CTLChartAxis;
class CTLChartTitle;
class CTLChartStandardAxis;
class CTLChartLineSerie;
class CTLChartImageSerie;
class CTLChartLegend;
/*窗口类名称*/
#define TLXYCHART_CLASSNAME _T("TLXYChartControl")
#define GRAPH_MARGIN_CHART 5
#define UM_SAVE_BITMAP WM_USER + 81 /*保存图像*/
#define UM_MANUAL_ZOOM WM_USER + 82 /*左键框选放大*/
#define UM_MANUAL_PAN WM_USER + 83 /*左键曲线平移*/
#define UM_LBDOWN_SELECT_PEAK WM_USER + 84 /*左键选取极值*/
#define UM_LBDOWN_SELECT_VALUE WM_USER + 85 /*左键选取任意值*/
/*坐标轴方位*/
enum EAxisPos
{
BottomAxis = 0,
LeftAxis
};
typedef std::map<unsigned, CTLChartSerie*> TSeriesMap;
typedef TSeriesMap::const_iterator TSeriesMapIter;
typedef std::map<unsigned, CTLChartAnnotation*> TAnnotationMap;
class AFX_EXT_CLASS CTLXYChart : public CWnd, public CTLBase
{
DECLARE_DYNAMIC(CTLXYChart)
public:
CTLXYChart();
virtual ~CTLXYChart();
protected:
DECLARE_MESSAGE_MAP()
public:
/*创建窗口*/
BOOL Create(DWORD dwStyle, CRect &rect, CWnd* pParentWnd, UINT nID);
/*设置图形区域大小*/
void SetChartSize(CRect &rect, CWnd *pParentWnd);
/*创建并连接标准轴*/
CTLChartStandardAxis* CreateStandardAxis(EAxisPos axisPos);
/*获取指向图形标题的指针*/
CTLChartTitle* GetTitlePtr() const {return m_pTitle;}
/*获取指向x轴的指针*/
CTLChartAxis* GetXAxis() const {return m_pAxes[0];}
/*获取指向y轴的指针*/
CTLChartAxis* GetYAxis() const {return m_pAxes[1];}
/*创建LineSerie*/
CTLChartLineSerie* CreateLineSerie();
/*创建imageSerie*/
CTLChartImageSerie* CreateImageSerie();
/*获取series数目,针对image类型返回0*/
int GetSeriesCount();
/*设置X轴名称*/
void SetXLabel(LPCTSTR szLabel);
/*设置Y轴名称*/
void SetYLabel(LPCTSTR szLabel);
/*获取绘图控件大小*/
CRect GetPlottingRect() const {return m_PlottingRect;}
/*获取图例指针*/
CTLChartLegend* GetLegend() const {return m_pLegend;}
/*判断是否为image*/
bool IsImageChart() const {return m_bIsImage;}
/**设置图形标题距离最顶端的边缘距离*/
void SetTitleMagrinToTop(int nMargin) {m_nTilteMargin = nMargin;}
private:
//注册“TLXYChartControl”窗口类
BOOL RegisterWindowClass();
/*绘制图形*/
void DrawChart(CDC* pDC, CRect ChartRect);
/*绘制图形区域背景*/
void DrawPlotAreaBackGnd(CDC* pDC, CRect rect, COLORREF clr);
/*连接轴到控件*/
void AttachCustomAxis(CTLChartAxis* pAxis, EAxisPos axisPos);
/*连接serie到控件*/
void AttachCustomSerie(CTLChartSerie* pNewSeries);
/*获取series中最大、最小值*/
void GetSeriesMinMax(double &dXMin, double &dXMax, double &dYMin, double &dYMax);
/*取消放大*/
void UndoPanZoom();
/*保存图片*/
void SaveBitmapToFile(HBITMAP hBitmap, LPCTSTR lpFileName);
/*获取最近的点坐标*/
void GetNearestPoint(const CPoint& pt, bool bAnyOrPeak);
/*移动调整点注释窗口的位置*/
void MoveAnnotationPosition();
/*获取map中指向第一个serie的迭代器*/
void GoToFirstSerie();
/*获取下一个迭代器所指向的serie指针;
该函数需与GoToFirstSerie()函数配对使用,否则会出现异常*/
CTLChartSerie* GetNextSerie();
/*初始化坐标轴范围*/
void InitialAxesMinMax();
/*初始化图形控件*/
void InitialChartConfiguration();
/*初始化图形*/
void InitializeChart();
private:
/*图形标题距离最顶端的边缘距离,默认为20个像素*/
int m_nTilteMargin;
/*绘图区域大小*/
CRect m_PlottingRect;
/*X及Y轴指针*/
CTLChartAxis* m_pAxes[2];
/*指向图形标准的指针*/
CTLChartTitle* m_pTitle;
/*图形框架线型颜色*/
COLORREF m_BorderColor;
/*图形区域背景色*/
COLORREF m_clrPlottingArea;
/*图例指针*/
CTLChartLegend* m_pLegend;
/*Series 数目*/
int m_nSerieCount;
/*注释个数*/
int m_nAnnotationCount;
/*series map*/
TSeriesMap m_mapSeries;
TSeriesMapIter m_currentSeries;
/*坐标值标注*/
TAnnotationMap m_mapAnnotation;
/*坐标值标注字体*/
CTLChartFont m_Annotationfont;
bool m_bZoomEnabled;
bool m_bLMouseDown;
CRect m_rectZoomArea;
COLORREF m_zoomRectColor;
/*图形处于放大状态*/
bool m_bZoomState;
double m_dXScreenMaxValue;
double m_dXScreenMinValue;
double m_dYScreenMaxValue;
double m_dYScreenMinValue;
bool m_bPanEnabled;
bool m_bPanState;
CPoint m_PanAnchor;
bool m_bIsImage;
bool m_bSelectEnabled;
bool m_bSelectPeakEnabled;
bool m_bSelectAnyEnabled;
public:
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnPaint();
afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
afx_msg void OnEditCopy();
afx_msg void OnSaveBitmap();
afx_msg void OnManualZoom();
afx_msg void OnManualPan();
afx_msg void OnSelectPeak();
afx_msg void OnSelectAnyPoint();
afx_msg LRESULT OnDeleteTips(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnDeleteAllTips(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnMovePosSouthEast(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnMovePosNorthEast(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnMovePosSouthWest(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnMovePosNorthWest(WPARAM wParam, LPARAM lParam);
};