📄 xgraphaxis.cpp
字号:
nHeight = 0;
}
else
nHeight += m_nMarkerSize;
}
}
if ((nMarker % 2))
nWidth += m_nMarkerSize;
return nWidth;
}
return 0;
}
void CXGraphAxis::DrawAxisMarkers(CDCEx *pDC)
{
CQuickFont font(_T("Arial"), 12, FW_BOLD);
CFontSelector fs(&font, pDC);
int nOldBkMode = pDC->GetBkMode ();
pDC->SetBkMode (TRANSPARENT);
CPoint pPoint;
if (m_AxisKind == yAxis)
{
for (int i = 0; i < m_AxisMarkers.size(); i++)
{
TDataPoint dPoint;
CPenSelector ps(m_AxisMarkers[i].crColor, m_AxisMarkers[i].nSize, pDC, m_AxisMarkers[i].nStyle);
dPoint.fYVal = m_AxisMarkers[i].fValue;
CPoint point = GetPointForValue(&dPoint);
if (m_pGraph->m_clInnerRect.top > point.y || m_pGraph->m_clInnerRect.bottom < point.y)
continue;
pDC->MoveTo(m_pGraph->m_clInnerRect.left, point.y);
pDC->LineTo(m_pGraph->m_clInnerRect.right, point.y);
CQuickFont vfont(&m_AxisMarkers[i].lfFont);
CFontSelector fsv(&vfont, pDC);
pPoint.y = point.y;
pPoint.x = m_pGraph->m_clInnerRect.left;
if (pDC->m_bPrinting)
pDC->AdjustRatio(pPoint);
if (m_AxisMarkers[i].bShowValue)
{
CString cVal;
if (m_bDateTime)
#ifndef _WIN32_WCE
cVal = COleDateTime(dPoint.fYVal).Format(m_cDisplayFmt);
#else
cVal = COleDateTime(dPoint.fYVal).Format();
#endif
else
cVal.Format(m_cDisplayFmt, dPoint.fYVal);
pDC->TextOut (pPoint.x, pPoint.y, cVal);
}
if (m_AxisMarkers[i].szLabel != _T(""))
{
CSize size = pDC->GetTextExtent("W");
CRect labelRect(m_pGraph->m_clInnerRect.left, point.y, m_pGraph->m_clInnerRect.right, point.y - size.cy);
labelRect.NormalizeRect();
if (pDC->m_bPrinting)
pDC->AdjustRatio(labelRect);
pDC->DrawText(m_AxisMarkers[i].szLabel, labelRect, DT_SINGLELINE | DT_RIGHT);
}
}
}
else
{
for (int i = 0; i < m_AxisMarkers.size(); i++)
{
TDataPoint dPoint;
CPenSelector ps(m_AxisMarkers[i].crColor, m_AxisMarkers[i].nSize, pDC, m_AxisMarkers[i].nStyle);
dPoint.fXVal = m_AxisMarkers[i].fValue;
CPoint point = GetPointForValue(&dPoint);
if (m_pGraph->m_clInnerRect.left > point.x || m_pGraph->m_clInnerRect.right < point.x)
continue;
pDC->MoveTo(point.x, m_pGraph->m_clInnerRect.bottom);
pDC->LineTo(point.x, m_pGraph->m_clInnerRect.top);
CQuickFont vfont(&m_AxisMarkers[i].lfFont);
CFontSelector fsv(&vfont, pDC);
pPoint.x = point.x;
pPoint.y = m_pGraph->m_clInnerRect.bottom;
if (pDC->m_bPrinting)
pDC->AdjustRatio(pPoint);
if (m_AxisMarkers[i].bShowValue)
{
CString cVal;
if (m_bDateTime)
#ifndef _WIN32_WCE
cVal = COleDateTime(dPoint.fXVal).Format(m_cDisplayFmt);
#else
cVal = COleDateTime(dPoint.fXVal).Format();
#endif
else
cVal.Format(m_cDisplayFmt, dPoint.fXVal);
pDC->TextOut (pPoint.x, pPoint.y, cVal);
}
if (m_AxisMarkers[i].szLabel != _T(""))
{
CSize size = pDC->GetTextExtent("W");
CRect labelRect(point.x, m_pGraph->m_clInnerRect.top + size.cy, point.x + size.cx, m_pGraph->m_clInnerRect.bottom);
labelRect.NormalizeRect();
if (pDC->m_bPrinting)
pDC->AdjustRatio(labelRect);
pDC->TextOut(labelRect.left - size.cy, labelRect.top + size.cx, m_AxisMarkers[i].szLabel);
}
}
}
pDC->SetBkMode (nOldBkMode);
}
void CXGraphAxis::DrawColorRanges(CDCEx *pDC)
{
CQuickFont font(_T("Arial"), 12, FW_BOLD);
CFontSelector fs(&font, pDC);
int nOldBkMode = pDC->GetBkMode ();
pDC->SetBkMode (TRANSPARENT);
if (m_AxisKind == yAxis)
{
for (int i = 0; i < m_ColorRanges.size(); i++)
{
TDataPoint point;
point.fYVal = m_ColorRanges[i].fMin;
int nMin = GetPointForValue (&point).y;
point.fYVal = m_ColorRanges[i].fMax;
int nMax = GetPointForValue (&point).y;
CRect colorRect(m_pGraph->m_clInnerRect.left,
min((int)max((int)nMax, (int)m_pGraph->m_clInnerRect.top), (int)m_pGraph->m_clInnerRect.bottom),
(int)m_pGraph->m_clInnerRect.right,
(int)max((int)min((int)nMin, (int)m_pGraph->m_clInnerRect.bottom), (int)m_pGraph->m_clInnerRect.top));
if (m_ColorRanges[i].nStyle == HS_SOLID)
{
if (m_ColorRanges[i].crMinColor != m_ColorRanges[i].crMaxColor)
{
if (pDC->m_bPrinting)
pDC->AdjustRatio (colorRect);
// LinearGradient(pDC, colorRect, m_ColorRanges[i].crMinColor, m_ColorRanges[i].crMaxColor, false);
}
else
{
CBrush brush(m_ColorRanges[i].crMinColor);
pDC->FillRect(colorRect, &brush);
}
}
else
{
CPenSelector ps(m_ColorRanges[i].crMinColor, 1, pDC);
#ifndef _WIN32_WCE
CBrushSelector bs(m_ColorRanges[i].crMinColor, m_ColorRanges[i].nStyle, pDC);
#else
CBrushSelector bs(m_ColorRanges[i].crMinColor, pDC);
#endif
pDC->Rectangle(colorRect);
}
if (CString(m_ColorRanges[i].szLabel) != _T(""))
{
colorRect.DeflateRect (2,2,2,2);
pDC->DrawText(m_ColorRanges[i].szLabel, colorRect, DT_LEFT | DT_TOP);
}
}
}
else
{
for (int i = 0; i < m_ColorRanges.size(); i++)
{
TDataPoint point;
point.fXVal = m_ColorRanges[i].fMin;
int nMin = GetPointForValue (&point).x;
point.fXVal = m_ColorRanges[i].fMax;
int nMax = GetPointForValue (&point).x;
CRect colorRect((int)min((int)max((int)nMin,(int)m_pGraph->m_clInnerRect.left),(int)m_pGraph->m_clInnerRect.right) ,
(int)m_pGraph->m_clInnerRect.top,
(int)max((int)min((int)nMax,(int)m_pGraph->m_clInnerRect.right), (int)m_pGraph->m_clInnerRect.left),
(int)m_pGraph->m_clInnerRect.bottom);
if (m_ColorRanges[i].nStyle == HS_SOLID)
{
if (m_ColorRanges[i].crMinColor != m_ColorRanges[i].crMaxColor)
{
if (pDC->m_bPrinting)
pDC->AdjustRatio (colorRect);
// LinearGradient(pDC, colorRect, m_ColorRanges[i].crMinColor, m_ColorRanges[i].crMaxColor, true);
}
else
{
CBrush brush(m_ColorRanges[i].crMinColor);
pDC->FillRect(colorRect, &brush);
}
}
else
{
CPenSelector ps(m_ColorRanges[i].crMinColor, 1, pDC);
#ifndef _WIN32_WCE
CBrushSelector bs(m_ColorRanges[i].crMinColor, m_ColorRanges[i].nStyle, pDC);
#else
CBrushSelector bs(m_ColorRanges[i].crMinColor, pDC);
#endif
pDC->Rectangle(colorRect);
}
if (CString(m_ColorRanges[i].szLabel) != _T(""))
{
colorRect.DeflateRect (2,2,2,2);
pDC->DrawText(m_ColorRanges[i].szLabel, colorRect, DT_LEFT | DT_TOP);
}
}
}
pDC->SetBkMode (nOldBkMode);
}
void CXGraphAxis::DrawLog(CDCEx* pDC)
{
CDCEx *pTmpDC = NULL;
if (!m_bVisible)
{
pTmpDC = new CDCEx;
pTmpDC->CreateCompatibleDC (pDC);
pDC = pTmpDC;
}
if (m_bAutoScale)
AutoScale(pDC);
m_fRange = m_fCurMax - m_fCurMin;
if (m_AxisKind == yAxis)
{
m_fSpareRange = (2*m_nArcSize);
m_fMarkerSpareSize = DrawCurveMarkers(pDC, false);
if (m_cLabel != "")
{
CSize titleSize;
{
CFontSelector fs(&m_TitleFont, pDC, false);
titleSize = GetTitleSize(pDC);
m_fSpareRange += titleSize.cy;
}
}
int nChartTop = m_clChart.top + m_fMarkerSpareSize;
int nTop = m_pGraph->m_clInnerRect.top + m_fSpareRange + m_fMarkerSpareSize;
int nBottom = m_pGraph->m_clInnerRect.bottom;
double fnY = m_nTop;
m_nRange = nBottom - nTop;
//m_nRange = m_nTop - fnYC - fStep;
DrawColorRanges(pDC);
DrawAxisMarkers(pDC);
m_fMarkerSpareSize = DrawCurveMarkers(pDC);
if (pDC->m_bMono)
pDC->SetBkColor(RGB(255,255,255));
else
pDC->SetBkColor(m_pGraph->m_crGraphColor);
pDC->SetBkMode(OPAQUE);
if (m_cLabel != "")
{
CSize titleSize;
{
CFontSelector fs(&m_TitleFont, pDC, false);
titleSize = GetTitleSize(pDC);
m_fSpareRange += titleSize.cy;
}
CFontSelector fs(&m_TitleFont, pDC);
if (m_Placement == apLeft)
{
CRect clTitle(m_nLeft - titleSize.cx - m_nTickSize, nChartTop, m_nLeft - m_nTickSize, nChartTop + titleSize.cy);
pDC->DrawText(m_cLabel, clTitle, DT_RIGHT);
}
else
{
CRect clTitle(m_nLeft + m_nTickSize, nChartTop, m_nLeft + titleSize.cx + m_nTickSize, nChartTop + titleSize.cy);
pDC->DrawText(m_cLabel, clTitle, DT_LEFT);
}
}
CString cTxt;
CSize csText;
// log scale
double minValue = pow(10.0,floor(log10(m_fCurMin)));
double maxValue = pow(10.0,ceil(log10(m_fCurMax)));
TDataPoint dataPoint;
for (double fY1 = minValue; fY1 < maxValue; fY1 *= 10)
{
for (double fY2 = fY1; fY2 < (fY1*10); fY2 += fY1)
{
if ((fY2 >= m_fCurMin) && (fY2 <= m_fCurMax))
{
dataPoint.fYVal = fY2;
fnY = GetPointForValue(&dataPoint).y;
// draw text
{
CFontSelector fs(&m_Font, pDC, false);
if (m_bDateTime)
#ifndef _WIN32_WCE
cTxt = COleDateTime(fY2).Format(m_cDisplayFmt);
#else
cTxt = COleDateTime(fY2).Format();
#endif
else
cTxt.Format(m_cDisplayFmt, fY2);
csText = GetTextExtentEx (pDC, cTxt);
}
CFontSelector fs(&m_Font, pDC);
if (m_Placement == apLeft)
{
if (fY2 == fY1)
{
CRect crText(m_nLeft - csText.cx - m_nTickSize, fnY - csText.cy / 2, m_nLeft - m_nTickSize, fnY + csText.cy / 2);
pDC->DrawText(cTxt, crText, DT_RIGHT);
}
CPenSelector ps(m_crGridColor, 1, pDC, m_nGridStyle);
pDC->MoveTo(m_nLeft - m_nTickSize, fnY);
// Spare last gridline to prevent axis to be overdrawn
if (!m_bShowGrid || (int)fnY == m_nTop)
pDC->LineTo(m_nLeft, fnY);
else
pDC->LineTo(m_pGraph->m_clInnerRect.right, fnY);
}
if (m_Placement == apRight)
{
if (fY2 == fY1)
{
CRect crText(m_nLeft + m_nTickSize, fnY - csText.cy / 2, m_nLeft + csText.cx + m_nTickSize, fnY + csText.cy / 2);
pDC->DrawText(cTxt, crText, DT_LEFT);
}
CPenSelector ps(m_crGridColor, 1, pDC, m_nGridStyle);
pDC->MoveTo(m_nLeft + m_nTickSize, fnY);
// Spare last gridline to prevent axis to be overdrawn
if (!m_bShowGrid || (int)fnY == m_nTop)
pDC->LineTo(m_nLeft, fnY);
else
pDC->LineTo(m_pGraph->m_clInnerRect.left, fnY);
}
}
}
}
CPenSelector ps(m_crColor, 1, pDC);
pDC->MoveTo (m_nLeft, m_nTop);
pDC->LineTo (m_nLeft, nChartTop);
DrawArc(pDC, CPoint(m_nLeft, nChartTop), up, m_nArcSize);
m_clRect.SetRect(m_nLeft - 5, nChartTop, m_nLeft + 5, m_nTop);
}
else
{
m_fSpareRange = (4*m_nArcSize);
m_fMarkerSpareSize = DrawCurveMarkers(pDC, false);
if (m_cLabel != "")
{
CSize titleSize;
{
CFontSelector fs(&m_TitleFont, pDC, false);
titleSize = GetTitleSize(pDC);
m_fSpareRange += titleSize.cx;
}
}
int nChartRight = m_pGraph->m_clInnerRect.right - m_fMarkerSpareSize;
int nLeft = m_pGraph->m_clInnerRect.left;
int nRight = m_pGraph->m_clInnerRect.right - m_fSpareRange - m_fMarkerSpareSize;
double fSteps = ((m_fCurMax - m_fCurMin) / m_fStep);
double fStep = ((double)(nChartRight - m_nLeft - m_fSpareRange) / fSteps);
double fnX = m_nLeft;
m_nRange = nRight - nLeft;
DrawColorRanges(pDC);
DrawAxisMarkers(pDC);
m_fMarkerSpareSize = DrawCurveMarkers(pDC);
if (pDC->m_bMono)
pDC->SetBkColor(RGB(255,255,255));
else
pDC->SetBkColor(m_pGraph->m_crGraphColor);
pDC->SetBkMode(OPAQUE);
CString cTxt;
CSize csText;
if (m_cLabel != "")
{
CSize titleSize;
{
CFontSelector fs(&m_TitleFont, pDC, false);
titleSize = GetTitleSize(pDC);
m_fSpareRange += titleSize.cx;
}
CFontSelector fs(&m_TitleFont, pDC);
CRect clTitle(nChartRight - titleSize.cx, m_nTop + m_nTickSize, nChartRight, m_nTop + m_nTickSize + titleSize.cy);
pDC->DrawText(m_cLabel, clTitle, DT_LEFT);
}
// Draw X-Axis Number and Line.
double minValue = pow(10.0,floor(log10(m_fCurMin)));
double maxValue = pow(10.0,ceil(log10(m_fCurMax)));
TDataPoint dataPoint;
for (double fX1 = minValue; fX1 < maxValue; fX1 *= 10)
{
for (double fX2 = fX1; fX2 < (fX1*10); fX2 += fX1)
{
if ((fX2 >= m_fCurMin) && (fX2 <= m_fCurMax))
{
dataPoint.fXVal = fX2;
fnX = GetPointForValue(&dataPoint).x;
// draw text
if (m_bDateTime)
#ifndef _WIN32_WCE
cTxt = COleDateTime(fX2).Format(m_cDisplayFmt);
#else
cTxt = COleDateTime(fX2).Format();
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -