⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 curvectrl.h

📁 功能非常强大的数据采集系统
💻 H
字号:
/*==============================================================================================================================*
// CurveCtrl.cpp											   
// 
// Author:		  Sunjoy Chen
// Email(MSN):    cfd@dl.cn
// Copyright 2004, Sunjoy Chen.
//
// Permission to use, copy, modify, distribute for any purpose is hereby
// granted without fee, provided that the above copyright notice and
// this permission notice included in all derived versions. 
// I will be glad to know you using it, let me know by email, and 
// your bugs report are also welcome. 
// This file is provided "as is" with no expressed or implied warranty.
//
// Special thanks to Chris Maunder(for his CGridCtrl which I had learned much from).
==============================================================================================================================*/

#if !defined(AFX_CURVECTRL_H__F4C6E288_12F8_42D9_A172_2A56A1839AFC__INCLUDED_)
#define AFX_CURVECTRL_H__F4C6E288_12F8_42D9_A172_2A56A1839AFC__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define INVALID_POINT	CPoint(-1,-1)

// Use this as the classname when inserting this control as a custom control
// in the MSVC++ dialog editor
// sucn as DDX_Control(pDX, IDC_MYCURVE, m_myCurveCtrl)
#define CURVECTRL_CLASSNAME    _T("MFCCurveCtrl")  // Window class name

// NOTIFY message, send to owner when curve changed by using mouse
#define CVN_MVALUE_ADD			LVN_FIRST-1		// add a point by clicking left key under edit mode
#define CVN_MVALUE_CHANG		LVN_FIRST-2		// when vertical value of a point change
#define CVN_MVALUE_DELETE		LVN_FIRST-3		// delete a point by clicking right key under edit mode

#define CVN_CURVE_SELECTED		LVN_FIRST-4		// curve is selected by clicking left key of mouse
#define CVN_CURVE_CANCELSELECT	LVN_FIRST-5		// curve is not selected
#define CVN_CURVE_SELECTNONE	LVN_FIRST-6		// no curve is selected


// using struct to send message to owner
// NOTE: that do not changed curve object address or point in owner's response function
typedef struct tagNM_CURVECTRL {
    NMHDR	hdr;
    void*   pCurve;		// curve object pointer
    int		iIndex;		// to curve point: index of key point(KP) on curve near cursor, -1 means no KP.
						// to curve: index of curve in CCurveCtrl near cursor, -1 means no curve
	float	fHori;		// horizontal value where cursor is
	float	fVert;		// vertical value where cursor is
} NM_CURVECTRL;

//////////////////////////////////////////////////////////////////////////
// CCurve: 
// Curve data and curve properties but you must according CCurveCtrl to add/delete/edit data 
// each curve in CCurveCtrl has one CCurve
class CCurve : public CObject
{
	friend class CCurveCtrl;
public:
	CCurve();
	virtual ~CCurve();

	void	ShowCurve(BOOL bShow = TRUE)	{ m_bVisible = bShow; };
	BOOL	IsVisible()                     { return m_bVisible;  };

	void	Select(BOOL bSelect = TRUE)  	{ m_bSelected = bSelect; };
	BOOL	IsSelected()					{ return m_bSelected;    };

	BOOL	SetCurveName(CString& strName)  
		{ if (strName.IsEmpty())  return FALSE; m_strName = strName; return TRUE; };
	CString GetCurveName()                  { return m_strName;    };

	void	SetCurveColor(COLORREF color)   { m_crColor = color;  };
	COLORREF GetCurveColor()                { return m_crColor;   };

	// curve line style 
	void	SetCurveStyle(int iStyle)       { m_iStyle = iStyle;  };
	int		GetCurveStyle()                 { return m_iStyle;    };

	// curve line width
	void	SetCurveWidth(int nWidth)       { m_nWidth = nWidth;  };
	int		GetCurveWidth()                 { return m_nWidth;    };

protected:
	BOOL		m_bSelected;	
	BOOL		m_bVisible;		

	CString		m_strName;		// curve name
	COLORREF	m_crColor;		// curve line color
	int			m_iStyle;		// curve line style
	int			m_nWidth;		// curve line style

	CArray< float, float >		m_fArrVertValue;						// vertical value(Y轴)
	CArray< float, float >		m_fArrHoriValue;						// horizontal value(X轴)
	CArray< CPoint, CPoint& >	m_ArrPoint;								// 曲线屏幕坐标显示点(由CalculatePoint()计算得到)

	static float	Distance(const CPoint& pt1, const CPoint& pt2);		// distance between two points
	BOOL			IsPointNearCurve(const CPoint& point, int& iIndex);	// whether the point near curve, iIndex is the nearest point's index
};

/////////////////////////////////////////////////////////////////////////////
// CCurveCtrl window

class CCurveCtrl : public CWnd
{
	DECLARE_DYNCREATE(CCurveCtrl)
// Construction / DeConstrution
public:
	CCurveCtrl();
    BOOL Create(const RECT& rect, CWnd* parent, UINT nID,
                DWORD dwStyle = WS_CHILD | WS_BORDER | WS_TABSTOP | WS_VISIBLE);
	virtual ~CCurveCtrl();

public:
// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CCurveCtrl)
	//}}AFX_VIRTUAL

	// add curve and data
	int		AddCurve(const CString& strName, COLORREF color = RGB(0, 0, 0), int iStyle = PS_SOLID, int nWidth = 1);
	BOOL	AddData(const CString& strName, float fHori, float fVert);
	BOOL	AddCurveData(const CString& strName, const CArray< float, float >& ArrHori, const CArray< float, float >& ArrVert);
	BOOL	AddData(CCurve* pCurve, float fHori, float fVert);

// delete data, not accomplished 
//	BOOL	DeleteDatabyIndex(CString& strName, int iIndex);
//	BOOL	DeleteDatabyIndex(CCurve* pCurve, int iIndex);
//	BOOL	DeleteDatabyVertValue(CString& strName, float fVert);

	// get curve object pointer
	CCurve* GetCurve(int iIndex);
	CCurve* GetCurve(const CString& strName);
	// get curve index in CCurveCtrl
	int		GetIndex(const CCurve* pCurve);

	// delete curve
	BOOL	Remove(int index);
	BOOL	Remove(const CString& strName);
	void	RemoveAll();	

	int		GetCurveCount();
	int		GetSelectedCount();
	
	// max and min value to be shown
	float		m_fHoriBegin;
	float		m_fHoriEnd;

	CPoint		m_pPoint;												//保存鼠标按下点
	// max and min value in vertical
	float		m_fVertMax;												//纵轴最大值
	float		m_fVertMin;												//纵轴最小值
	bool		m_bVert;												//纵轴数据重新计算标志

	// move left or right, all curves and coordinate
	void	Move(BOOL bLeft,int nHoriGrid);
	void	MovePage(BOOL bLeft);

	// shift curve (will change horizontal value of the curve)
	void	CurveLeft(CCurve* pCurve, float fLen);
	void	CurveRight(CCurve* pCurve, float fLen);
	
	// mirror in horizontal
	void	MirrorHori(CCurve* pCurve, float fMid);
	// mirror in vertical
	void	MirrorVert(CCurve* pCurve, float fMid);


	void	Restore();													//显示所有曲线

	// zoom in (bIn: TRUE) or zoom out(bIn: FALSE)
	BOOL	Zoom(BOOL bIn);

	// axis label 
	void	SetHoriLabel(CString& str);
	CString GetHoriLabel();
	void	SetVertLabel(CString& str);
	CString GetVertLabel();

	// cross line when mouse moving
	void	ShowCross(BOOL bShow);
	BOOL	IsShowCross();

	// margin to show title, etc
	void	SetMargin(const CRect& rect);
	CRect	GetMargin();

	// whether can  edit curve data by using mouse  
	void	EnableEdit(BOOL bEdit);
	BOOL	CanEditCurve();
	
	// line style in background
	void	SetGridLineStyle(int iStyle);
	int		GetGridLineStyle();

	void	ReCalcAllVert();											//重新计算Y轴数据范围
	void	CalcAllAdd(CPoint point,int v_iPage);						//图形放大显示

protected:
	BOOL	RegisterWindowClass();

	void	DrawCurve(CDC *pdc);
	void	DrawCross(CDC *pdc);
	void	DrawGrid(CDC *pdc, const CRect& rect);	
	
	// calculate point in pixel by horizontal and vertical value
	BOOL	CalculatePoint(float fHori, float fVert, CPoint& point);
	void	ReCalcAllPoint();

	// calculate horizontal and vertical value by point in pixel
	BOOL	CalculateValue(const CPoint& point, float& fHori, float& fVert);
	
	// calculate vertical range in max or min
	void	CalculateVertRange(float fValue, BOOL bMax);

	// sort curve data by horizontal value
	void	SortCurveData(CCurve* pCurve);
	
	int	InsertDataToCurve(CCurve* pCurve, float fHori, float fVert, CPoint point = INVALID_POINT);

    LRESULT SendMessageToParent(int nMessage, CCurve* pCurve, int iIndex, float fHori, float fVert) const;

private:
	// max and min data value in horizontal
	float		m_fHoriMax;
	float		m_fHoriMin;

	CRect		m_RectCoord;	// rect to draw curve
	CRect		m_Margin;       // used to save margin in four direction

	// font, may be in future...
//	CFont	m_fontAxis;
//	CFont	m_fontTitle;

	COLORREF	m_crBack;		// background color
	COLORREF	m_crGridLine;	// grid line color
	COLORREF	m_crAxis;		// axis color
//	COLORREF	m_crTitle;		// title color

	int			m_iGridLineStyle;	// grid line style
	BOOL		m_bDrawGrid;	// whether draw grid
	BOOL		m_bShowCross;   // whether show cross

	// label string
	CString		m_strHoriLabel;
	CString		m_strVertLabel;

	BOOL		m_bEdit;		// whether in edit mode
	CCurve*		m_pCurveEdit;	// curve be edited  
	int			m_iCurPoint;    // point be edited

	int			m_iZoom;		// zoom 

	// save value of edited point 
	float		m_fOldHori;
	float		m_fOldVert;

	CToolTipCtrl	m_Tooltip;
	
	CArray< CCurve*, CCurve* >  m_ArrCurve;								//曲线参数数组

	// Generated message map functions
protected:
	//{{AFX_MSG(CCurveCtrl)
	afx_msg void OnPaint();
	afx_msg void OnMouseMove(UINT nFlags, CPoint point);
	afx_msg BOOL OnEraseBkgnd(CDC* pDC);
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
	afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
	afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_CURVECTRL_H__F4C6E288_12F8_42D9_A172_2A56A1839AFC__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -