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

📄 chartbase.cpp

📁 这是本人两年前兼职为某个公司做的石油钻进设计软件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		x1    = GetAxis().GetLeft().CalcYPosValue(GetAxis().GetLeft().GetMinimum());
		width = GetAxis().GetLeft().GetMaximum() - GetAxis().GetLeft().GetMinimum();
		len_y = ((double)m_lSelEndY - m_lSelBeginY) / (x1 - x0) * width;

		str.Format("%s%s%.2f\n\r%s%s%.2f", GetAxis().GetBottom().GetTitle().GetCaption(), ": ", len_x, 
			       GetAxis().GetLeft().GetTitle().GetCaption(), ": ", len_y);
		MessageBox(str, "测量距离");
		m_lSelEndX  = 0;

		Repaint();
	}

	if( Button == 1 && GetSeries(0).GetCount() != 0 && (m_bZoom || m_bGraphPre) )
	{
		m_rZoom.right   = X;
		m_rZoom.bottom  = Y;

		if(m_bZoom)
		{// 放大
			((CCVenusApp*)AfxGetApp())->m_pGraphDlg->HideTipDlg();
			if(X > m_rZoom.left && Y > m_rZoom.top)
			{// 放大
				if(m_dZoomXMin == 0 && m_dZoomXMax == 0 && m_dZoomYMin == 0 && m_dZoomYMax == 0)
				{
					m_dZoomXMin = GetAxis().GetBottom().GetMinimum();
					m_dZoomXMax = GetAxis().GetBottom().GetMaximum();
					m_dZoomYMin = GetAxis().GetLeft().GetMinimum();
					m_dZoomYMax = GetAxis().GetLeft().GetMaximum();
				}

				if( IsEnableZoom() )
				{
					GetZoom().ZoomRect(m_rZoom.left, m_rZoom.top, m_rZoom.right, m_rZoom.bottom);
				}
				else
				{
					Beep(650, 50);
					AfxMessageBox("不能继续放大!", MB_ICONSTOP);
				}
			}
			else if(X < m_rZoom.left && Y < m_rZoom.top)
			{// 还原
				m_dZoomXMin = GetAxis().GetBottom().GetMinimum();
				m_dZoomXMax = GetAxis().GetBottom().GetMaximum();
				m_dZoomYMin = GetAxis().GetLeft().GetMinimum();
				m_dZoomYMax = GetAxis().GetLeft().GetMaximum();
				GetZoom().Undo();
			}
			// 取消游标
			m_bShowCursor = FALSE;
			m_bMoveCursor = FALSE;
			m_bZoom       = FALSE;
			Repaint();
		}
	}
}
/*************************************************************************
 *
 * CalcValueRgn()
 *
 * 功  能: 计算选定区域物理范围值
 *
 * 参  数: CRect selRc: 屏幕选定区域
 *         
 * 返回值: 无
 *
 *************************************************************************/
void CChartBase::CalcValueRgn(CRect selRc, double& xMin, double& xMax, double& yMin, double& yMax)
{
	long left  = GetAxis().GetBottom().CalcXPosValue(GetAxis().GetBottom().GetMinimum());
	long right = GetAxis().GetBottom().CalcXPosValue(GetAxis().GetBottom().GetMaximum());
	long width = right - left;

	long top    = GetAxis().GetLeft().CalcYPosValue(GetAxis().GetLeft().GetMaximum());
	long bottom = GetAxis().GetLeft().CalcYPosValue(GetAxis().GetLeft().GetMinimum());
	long height = bottom - top;

	double tmp1 = GetAxis().GetBottom().GetMaximum() - GetAxis().GetBottom().GetMinimum();
	double tmp2 = GetAxis().GetLeft().GetMaximum() - GetAxis().GetLeft().GetMinimum();

	// 得到物理值范围
	xMin = ((double)m_rZoom.left   - left) / width  * tmp1 + GetAxis().GetBottom().GetMinimum();
	xMax = ((double)m_rZoom.right  - left) / width  * tmp1 + GetAxis().GetBottom().GetMinimum();
	yMax = (bottom - (double)selRc.top )   / height * tmp2 + GetAxis().GetLeft().GetMinimum();
	yMin = (bottom - (double)selRc.bottom) / height * tmp2 + GetAxis().GetLeft().GetMinimum();
}
/*************************************************************************
 *
 * AddData()
 *
 * 功  能: 增加绘图数据
 *
 * 参  数: long SeriesIndex:系列索引
 *         double x:        X轴值
 *         double y:        Y轴值
 *         
 * 返回值: 无
 *
 *************************************************************************/
void CChartBase::AddData(long SeriesIndex, double x, double y, COLORREF color)
{
	GetSeries(SeriesIndex).AddXY(x, y, "", color);
}
/*************************************************************************
 *
 * ShowCursor()
 *
 * 功  能: 显示光标
 *
 * 参  数: 无
 *         
 * 返回值: 无
 *
 *************************************************************************/
void CChartBase::ShowCursor()
{
	if(GetSeries(0).GetCount() == 0) return; // 无数据

	m_bShowCursor = TRUE;
}
/*************************************************************************
 *
 * OnAfterDrawTChart()
 *
 * 功  能: 自绘制图形(分布选定区域)
 *
 * 参  数: 无
 *         
 * 返回值: 无
 *
 *************************************************************************/
void CChartBase::OnAfterDrawTChart() 
{
	if(m_bMouseSel)
	{// 鼠标选定
		if(m_lSelEndX != 0)
		{
			GetCanvas().GetBrush().SetStyle(1);
			GetCanvas().GetPen().SetColor(RGB(255, 0, 0));
			GetCanvas().SetBackMode(1);
			GetCanvas().Rectangle(m_rZoom.left, m_rZoom.top, m_rZoom.right, m_rZoom.bottom);
		}
	}

	if(m_bShowCursor)
	{
		// 得到绘制区域
		int left   = GetAxis().GetBottom().CalcXPosValue(GetAxis().GetBottom().GetMinimum());
		int right  = GetAxis().GetBottom().CalcXPosValue(GetAxis().GetBottom().GetMaximum());
		int top    = GetAxis().GetLeft().CalcYPosValue(GetAxis().GetLeft().GetMaximum());
		int bottom = GetAxis().GetLeft().CalcYPosValue(GetAxis().GetLeft().GetMinimum());
		
		GetCanvas().GetPen().SetColor(RGB(255, 0, 0));
		GetCanvas().GetPen().SetStyle(1);
		// 水平轴
		GetCanvas().Line(left, m_lvScale, right, m_lvScale);
		// 垂直轴
		GetCanvas().Line(m_lhScale, top, m_lhScale, bottom);
	}
	
	if(m_bDrawLineMark)
	{
		CRect     rc;
		long      lMarkLoc;
		long      x, y;
		long      count;
		CString   str;
		long      len;

		len  = 30;
		count = GetSeriesCount();
		for(long i = 0; i < count; i++)
		{
			long cc = GetSeries(i).GetCount();
			if(cc == 0) continue;
			lMarkLoc  = long(GetSeries(i).GetCount() / (1.2 * count) * (i + 1));
			double kk = GetSeries(i).GetXValues().GetValue(lMarkLoc);
			x = GetAxis().GetBottom().CalcXPosValue(GetSeries(i).GetXValues().GetValue(lMarkLoc));
			y = GetAxis().GetLeft().CalcYPosValue(GetSeries(i).GetYValues().GetValue(lMarkLoc));
			rc.left   = x - 8 + len;
			rc.top    = y - 8;
			rc.right  = x + 8 + len;
			rc.bottom = y + 8;


			GetCanvas().GetBrush().SetStyle(1);
			GetCanvas().GetFont().SetName("宋体");
			GetCanvas().GetFont().SetHeight(12);
			long color = GetSeries(i).GetPointColor(lMarkLoc);
			color = GetSeries(i).GetAsFastLine().GetLinePen().GetColor();
			GetCanvas().GetFont().SetColor( color );
			GetCanvas().GetPen().SetColor( color );
			GetCanvas().GetPen().SetStyle(2);

			GetCanvas().Line(x, y, x + len - 8, y);
			GetCanvas().GetPen().SetStyle(0);
			
			GetCanvas().Ellipse(rc.left, rc.top, rc.right, rc.bottom);
			str.Format("%d", i + 1);
			if(i<9)
				GetCanvas().TextOut(rc.left + 5, rc.top + 2, str);
			else
				GetCanvas().TextOut(rc.left + 3, rc.top + 2, str);

/*			long cc = GetSeries(i).GetCount();
			if(cc == 0) continue;
			lMarkLoc  = GetSeries(i).GetCount() / count * (i + 1);
			double kk = GetSeries(i).GetXValues().GetValue(lMarkLoc);
			x = GetAxis().GetBottom().CalcXPosValue(GetSeries(i).GetXValues().GetValue(lMarkLoc));
			y = GetAxis().GetLeft().CalcYPosValue(GetSeries(i).GetYValues().GetValue(lMarkLoc));
			rc.left   = x - 8;
			rc.top    = y - 8;
			rc.right  = x + 8;
			rc.bottom = y + 8;

			GetCanvas().GetBrush().SetStyle(1);
			GetCanvas().GetFont().SetName("宋体");
			GetCanvas().GetFont().SetHeight(12);
			long color = GetSeries(i).GetPointColor(lMarkLoc);
			color = GetSeries(i).GetAsFastLine().GetLinePen().GetColor();
			GetCanvas().GetFont().SetColor( color );
			GetCanvas().GetPen().SetColor( color );
			
			GetCanvas().Ellipse(rc.left, rc.top, rc.right, rc.bottom);
			str.Format("%d", i + 1);
			GetCanvas().TextOut(rc.left + 5, rc.top + 2, str);
*/		}
	}

	if( ((CCVenusApp*)AfxGetApp())->m_pGraphData == NULL )
		return;

	long        top, left, right, bottom;
	POSITION    pos;
	CString     str, str1;

	// 绘制坐标
	m_iGraphLoc = ((CCVenusApp*)AfxGetApp())->m_iGraphLoc - 1;
	GetCanvas().GetPen().SetColor(RGB(255, 0, 0));
	GetCanvas().GetFont().SetColor(RGB(0, 0, 255));
	GetCanvas().GetFont().SetName("宋体");
	GetCanvas().GetFont().SetHeight(12);
	left   = GetAxis().GetBottom().CalcXPosValue(GetAxis().GetBottom().GetMinimum());
	right  = GetAxis().GetBottom().CalcXPosValue(GetAxis().GetBottom().GetMaximum());
	top    = GetAxis().GetLeft().CalcYPosValue(GetAxis().GetLeft().GetMaximum());
	bottom = GetAxis().GetLeft().CalcYPosValue(GetAxis().GetLeft().GetMinimum());

	pos = ((CCVenusApp*)AfxGetApp())->m_pGraphData[m_iGraphLoc].slDescription.FindIndex(4);
	str = ((CCVenusApp*)AfxGetApp())->m_pGraphData[m_iGraphLoc].slDescription.GetAt(pos);
	GetCanvas().TextOut(left, top - 15, str);

	pos = ((CCVenusApp*)AfxGetApp())->m_pGraphData[m_iGraphLoc].slDescription.FindIndex(5);
	str = ((CCVenusApp*)AfxGetApp())->m_pGraphData[m_iGraphLoc].slDescription.GetAt(pos);
	GetCanvas().TextOut(right + 5, bottom - 10, str);

	// 绘制说明
	CStringList		slDescription;
	int		iMaxLength,iTempLen;
	CCVenusApp *pApp = (CCVenusApp*)AfxGetApp();
	pos = pApp->m_pGraphData[m_iGraphLoc].slDescription.FindIndex(6);
	str = pApp->m_pGraphData[m_iGraphLoc].slDescription.GetAt(pos);
	iMaxLength = str.GetLength();
	slDescription.AddTail(str);
	pos = pApp->m_pGraphData[m_iGraphLoc].slDescription.FindIndex(7);
	str = pApp->m_pGraphData[m_iGraphLoc].slDescription.GetAt(pos);
	iTempLen = str.GetLength();
	if(iMaxLength < iTempLen)
	{
		iMaxLength = iTempLen;
	}
	slDescription.AddTail(str);
	for(int kk = 0; kk < pApp->m_pGraphData[m_iGraphLoc].iLineNum; kk++)
	{
		pos = pApp->m_pGraphData[m_iGraphLoc].slDescription.FindIndex(8 + kk);
		str = pApp->m_pGraphData[m_iGraphLoc].slDescription.GetAt(pos);
		str1.Format("%d__%s", kk + 1, str);
		slDescription.AddTail(str1);
		iTempLen = str1.GetLength();
		if(iMaxLength < iTempLen)
		{
			iMaxLength = iTempLen;
		}
	}

	right -= 10;
	int	iTotal;
	for(iTotal=0; iTotal<slDescription.GetCount();iTotal++)
	{
		pos = slDescription.FindIndex(iTotal);
		str = slDescription.GetAt(pos);
		GetCanvas().TextOut(right + 35, top + 15 + iTotal * 18, str);
	}
	GetCanvas().GetBrush().SetStyle(1);
	GetCanvas().Rectangle(right + 30, top, right + 30 + int(6.5*iMaxLength), top + 15 + 18*iTotal );


	GetCanvas().GetFont().SetHeight(12);
	GetCanvas().GetFont().SetHeight(12);
	GetCanvas().GetFont().SetColor(RGB(255, 0, 0));
	GetCanvas().GetPen().SetColor(RGB(128, 255, 255));
	GetCanvas().Line(right + 33, top, right + 60, top);
	GetCanvas().TextOut(right + 35, top - 5, "说明");
/*
	right -= 10;
	CCVenusApp *pApp = (CCVenusApp*)AfxGetApp();
	GetCanvas().GetBrush().SetStyle(1);
//	GetCanvas().Rectangle(right + 30, top, right + 165, top + 27 * pApp->m_pGraphData[m_iGraphLoc].iLineNum);
	GetCanvas().Rectangle(right + 30, top, right + 155, top + 23 * pApp->m_pGraphData[m_iGraphLoc].iLineNum);

	pos = ((CCVenusApp*)AfxGetApp())->m_pGraphData[m_iGraphLoc].slDescription.FindIndex(6);
	str = ((CCVenusApp*)AfxGetApp())->m_pGraphData[m_iGraphLoc].slDescription.GetAt(pos);
	GetCanvas().TextOut(right + 35, top + 10, str);

	pos = ((CCVenusApp*)AfxGetApp())->m_pGraphData[m_iGraphLoc].slDescription.FindIndex(7);
	str = ((CCVenusApp*)AfxGetApp())->m_pGraphData[m_iGraphLoc].slDescription.GetAt(pos);
	GetCanvas().TextOut(right + 35, top + 25, str);

	GetCanvas().GetFont().SetHeight(12);
	for(int kk = 0; kk < pApp->m_pGraphData[m_iGraphLoc].iLineNum; kk++)
	{
		pos = ((CCVenusApp*)AfxGetApp())->m_pGraphData[m_iGraphLoc].slDescription.FindIndex(8 + kk);
		if(pos == NULL)
		{	Beep(650, 50);
			AfxMessageBox("图象格式错误!",MB_ICONERROR);
			return;
		}

		str = ((CCVenusApp*)AfxGetApp())->m_pGraphData[m_iGraphLoc].slDescription.GetAt(pos);
		str1.Format("%d__%s", kk + 1, str);
//		GetCanvas().TextOut(right + 35, top + 45 + kk * 20, str1);
		GetCanvas().TextOut(right + 35, top + 45 + kk * 15, str1);
	}
	GetCanvas().GetFont().SetHeight(12);
	GetCanvas().GetFont().SetColor(RGB(255, 0, 0));
	GetCanvas().GetPen().SetColor(RGB(128, 255, 255));
	GetCanvas().Line(right + 78, top, right + 105, top);
	GetCanvas().TextOut(right + 80, top - 5, "说明");
*/
}
/*************************************************************************
 *
 * OnOnClickSeriesTchart()
 *
 * 功  能: 响应单击系列
 *
 * 参  数: TeeChart传递的参数值
 *         
 * 返回值: 无
 *
 *************************************************************************/
void CChartBase::OnOnClickSeriesTchart(long SeriesIndex, long ValueIndex, long Button, long Shift, long X, long Y) 
{
	double xValue, yValue;

	if(Button == 1)
	{
		xValue = GetSeries(SeriesIndex).GetXValues().GetValue(ValueIndex);
		yValue = GetSeries(SeriesIndex).GetYValues().GetValue(ValueIndex);
	}
}
/*************************************************************************
 *
 * ClickInRect()
 *
 * 功  能: 判断鼠标按下的位置是否在绘制区域内
 *
 * 参  数: long x: X轴坐标
 *         long y: Y轴坐标
 *         
 * 返回值: 无
 *
 *************************************************************************/
BOOL CChartBase::ClickInRect(long x, long y, CRect& rc) 
{
	POINT point;

	point.x = x;
	point.y = y;

	rc.left   = (int)GetAxis().GetBottom().CalcXPosValue(GetAxis().GetBottom().GetMinimum()) - 1;
	rc.right  = (int)GetAxis().GetBottom().CalcXPosValue(GetAxis().GetBottom().GetMaximum()) + 2;
	rc.top    = (int)GetAxis().GetLeft().CalcYPosValue(GetAxis().GetLeft().GetMaximum()) - 1;
	rc.bottom = (int)GetAxis().GetLeft().CalcYPosValue(GetAxis().GetLeft().GetMinimum()) + 1;

	return rc.PtInRect(point);
}
/*************************************************************************
 *
 * ClearUp()
 *
 * 功  能: 清除控件数据
 *
 * 参  数: 无
 *         
 * 返回值: 无
 *
 *************************************************************************/
void CChartBase::ClearUp() 
{
	long count = GetSeriesCount();
	for(int i = 0; i < count; i++)
	{//	清除
		RemoveSeries(0);
	}
}
/*************************************************************************
 *
 * IsEnableZoom()
 *
 * 功  能: 判断是否能继续放大
 *
 * 参  数: 无
 *         
 * 返回值: 无
 *
 *************************************************************************/
BOOL CChartBase::IsEnableZoom() 
{
	double max, min, value_h, value_v;

	// 水平方向
    max = GetAxis().GetBottom().GetMaximum();
    min = GetAxis().GetBottom().GetMinimum();
	value_h = max - min;

	// 垂直方向
    max = GetAxis().GetLeft().GetMaximum();
    min = GetAxis().GetLeft().GetMinimum();
	value_v = max - min;

	if( value_v < 0.00001 || value_h < 0.00001 )
	{
		return FALSE;
	}

	return TRUE;
}
/*************************************************************************
 *
 * GetPosValue()
 *
 * 功  能: 得到鼠标位置值
 *
 * 参  数: long x, long y
 *         
 * 返回值: 无
 *
 *************************************************************************/
CString CChartBase::GetPosValue(long x, long y) 
{
	double   xValue, yValue;
	CString  str, str1, str2;
	POSITION pos;

	long left   = GetAxis().GetBottom().CalcXPosValue(GetAxis().GetBottom().GetMinimum());
	long right  = GetAxis().GetBottom().CalcXPosValue(GetAxis().GetBottom().GetMaximum());
	long width  = right - left;

	long top    = GetAxis().GetLeft().CalcYPosValue(GetAxis().GetLeft().GetMaximum());
	long bottom = GetAxis().GetLeft().CalcYPosValue(GetAxis().GetLeft().GetMinimum());
	long height = bottom - top;

	double tmp1 = GetAxis().GetBottom().GetMaximum() - GetAxis().GetBottom().GetMinimum();
	double tmp2 = GetAxis().GetLeft().GetMaximum() - GetAxis().GetLeft().GetMinimum();

	// 得到物理值范围
	xValue = ((double)x   - left) / width  * tmp1 + GetAxis().GetBottom().GetMinimum();
	yValue = (bottom   - (double)y) / height  * tmp2 + GetAxis().GetLeft().GetMinimum();

	pos  = ((CCVenusApp*)AfxGetApp())->m_pGraphData[m_iGraphLoc].slDescription.FindIndex(4);
	str1 = ((CCVenusApp*)AfxGetApp())->m_pGraphData[m_iGraphLoc].slDescription.GetAt(pos);
	pos  = ((CCVenusApp*)AfxGetApp())->m_pGraphData[m_iGraphLoc].slDescription.FindIndex(5);
	str2 = ((CCVenusApp*)AfxGetApp())->m_pGraphData[m_iGraphLoc].slDescription.GetAt(pos);
	str.Format("%s:%.0f %s:%.2f", str2, xValue, str1, yValue);

	return str;
}
/*************************************************************************
 *
 * DrawLineMark()
 *
 * 功  能: 是否绘制标记
 *
 * 参  数: BOOL bDrawMark
 *         
 * 返回值: 无
 *
 *************************************************************************/
void CChartBase::DrawLineMark(BOOL bDrawMark) 
{
	m_bDrawLineMark = bDrawMark;
}

⌨️ 快捷键说明

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