📄 chartbase.cpp
字号:
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 + -