📄 chartwnd.cpp
字号:
// ChartWnd.cpp : 实现文件
//
#include "stdafx.h"
#include "TestFunc.h"
#include "PCIEBoardTest.h"
#include ".\chartdata.h"
#include "ChartWnd.h"
#include ".\chartwnd.h"
// CChartWnd
IMPLEMENT_DYNAMIC(CChartWnd, CWnd)
CChartWnd::CChartWnd()
{
m_nChartCount = 0;
for(int i=0; i<MAX_CHART_COUNT; ++i)
m_pChartItem[i] = NULL;
m_AxresInfor[0].Transformer = 1024; // k
m_AxresInfor[1].Transformer = 1000 * 1000; // M
}
CChartWnd::~CChartWnd()
{
for(int i=0; i<MAX_CHART_COUNT; ++i)
{
if (m_pChartItem[i])
{
delete m_pChartItem[i];
m_pChartItem[i] = NULL;
}
}
m_nChartCount = 0;
}
BEGIN_MESSAGE_MAP(CChartWnd, CWnd)
ON_WM_ERASEBKGND()
ON_WM_CREATE()
ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()
// CChartWnd 消息处理程序
BOOL CChartWnd::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CRect rectClient;
CRect rectSubTitle; // 图示说明区域
CRect rectFrame; // 坐标系区域,其左下角即为原点位置
LOGFONT lfTitle;
LOGFONT lfAxresName[2];
LOGFONT lfSubTitle;
LOGFONT lfAxresLabel[2];
CFont fontTitle;
CFont fontAxresName[2];
CFont fontSubTitle;
CFont fontAxresLabel[2];
CFont* pOldFont;
CSize sizeTitle;
CSize sizeSubTitle;
CSize sizeXTitle;
CSize sizeYTitle;
CSize sizeXLabel;
CSize sizeYLabel;
CPen penFrame;
CPen * pOldPen;
int i;
int j;
::ZeroMemory (&lfTitle, sizeof (lfTitle));
::ZeroMemory (&lfAxresName[0], sizeof (lfAxresName[0]));
::ZeroMemory (&lfAxresName[1], sizeof (lfAxresName[1]));
::ZeroMemory (&lfSubTitle, sizeof (lfSubTitle));
::ZeroMemory (&lfAxresLabel[0], sizeof (lfAxresLabel[0]));
::ZeroMemory (&lfAxresLabel[1], sizeof (lfAxresLabel[1]));
// Title
lfTitle.lfHeight = 120;
lfTitle.lfWeight = FW_BOLD;
::lstrcpy (lfTitle.lfFaceName, _T ("System"));
fontTitle.CreatePointFontIndirect (&lfTitle);
// X Axres Name
lfAxresName[0].lfHeight = 120;
lfAxresName[0].lfWeight = FW_NORMAL;
::lstrcpy (lfAxresName[0].lfFaceName, _T ("System"));
fontAxresName[0].CreatePointFontIndirect (&lfAxresName[0]);
// Y Axres Name
lfAxresName[1].lfHeight = 120;
lfAxresName[1].lfWeight = FW_NORMAL;
lfAxresName[1].lfEscapement = 900;
lfAxresName[1].lfOrientation = 900;
::lstrcpy (lfAxresName[1].lfFaceName, _T ("System"));
fontAxresName[1].CreatePointFontIndirect (&lfAxresName[1]);
// SubTitle Name
lfSubTitle.lfHeight = 90;
lfSubTitle.lfWeight = FW_NORMAL;
::lstrcpy (lfSubTitle.lfFaceName, _T ("System"));
fontSubTitle.CreatePointFontIndirect (&lfSubTitle);
// X Axres Label
lfAxresLabel[0].lfHeight = 100;
lfAxresLabel[0].lfWeight = FW_NORMAL;
::lstrcpy (lfAxresLabel[0].lfFaceName, _T ("System"));
fontAxresLabel[0].CreatePointFontIndirect (&lfAxresLabel[0]);
// Y Axres Label
lfAxresLabel[1].lfHeight = 100;
lfAxresLabel[1].lfWeight = FW_NORMAL;
::lstrcpy (lfAxresLabel[1].lfFaceName, _T ("System"));
fontAxresLabel[1].CreatePointFontIndirect (&lfAxresLabel[1]);
GetClientRect(rectClient);
// 背景
pDC->FillSolidRect(rectClient, RGB(255, 255, 255));
// 计算X/Y轴信息,如图形显示比较慢,可以放到AddChart等位置去更新,以节省绘图时间
CalcChart();
// 计算各个位置:
// title显示位置、xtitle显示位置、ytitle显示位置、原点位置、x轴顶端位置、y轴顶端位置、x/y显示比率
// 图示显示位置/大小
// 显示Title
pOldFont = pDC->SelectObject (&fontTitle);
sizeTitle = pDC->GetOutputTextExtent(m_strTitle);
pDC->TextOut ((rectClient.left + rectClient.right - sizeTitle.cx) / 2, 2, m_strTitle);
pDC->SelectObject (pOldFont);
// 显示X Title
pOldFont = pDC->SelectObject (&fontAxresName[0]);
sizeXTitle = pDC->GetOutputTextExtent(m_strAxresName[0]);
pDC->TextOut ((rectClient.left + rectClient.right - sizeXTitle.cx) / 2, rectClient.bottom - 2 - sizeXTitle.cy, m_strAxresName[0]);
pDC->SelectObject (pOldFont);
// 显示Y Title
pOldFont = pDC->SelectObject (&fontAxresName[1]);
sizeYTitle = pDC->GetOutputTextExtent(m_strAxresName[1]);
pDC->TextOut (rectClient.left + 5, (rectClient.top + rectClient.bottom + sizeYTitle.cx) / 2, m_strAxresName[1]);
pDC->SelectObject (pOldFont);
// 获取Xlabel、Ylabel大小
pOldFont = pDC->SelectObject(&fontAxresLabel[0]);
// sizeXLabel = pDC->GetOutputTextExtent("000");
sizeXLabel.cx = 0;
for(i=0; i<=m_AxresInfor[0].Layers; ++i)
{
// label
CString strLabel;
strLabel.Format("%d", (int)((m_AxresInfor[0].BaseValue + i * m_AxresInfor[0].UnitValue) / (m_AxresInfor[0].Transformer)));
CSize sizeTemp;
sizeTemp = pDC->GetOutputTextExtent(strLabel);
if (sizeTemp.cx > sizeXLabel.cx)
sizeXLabel = sizeTemp;
}
pDC->SelectObject(pOldFont);
pOldFont = pDC->SelectObject(&fontAxresLabel[1]);
// sizeYLabel = pDC->GetOutputTextExtent("000");
sizeYLabel.cx = 0;
for(i=0; i<=m_AxresInfor[1].Layers; ++i)
{
// label
CString strLabel;
if (m_AxresInfor[1].UnitValue > m_AxresInfor[1].Transformer && (m_AxresInfor[1].UnitValue % m_AxresInfor[1].Transformer == 0))
strLabel.Format("%d", (int)((m_AxresInfor[1].BaseValue + i * m_AxresInfor[1].UnitValue) / (m_AxresInfor[1].Transformer)));
else
strLabel.Format("%.1f", (m_AxresInfor[1].BaseValue + i * m_AxresInfor[1].UnitValue * 1.0) / (m_AxresInfor[1].Transformer));
CSize sizeTemp;
sizeTemp = pDC->GetOutputTextExtent(strLabel);
if (sizeTemp.cx > sizeYLabel.cx)
sizeYLabel = sizeTemp;
}
pDC->SelectObject(pOldFont);
// 显示图示
pOldFont = pDC->SelectObject(&fontSubTitle);
sizeSubTitle = pDC->GetOutputTextExtent("000");
sizeSubTitle.cy += 4; //加上画矩形所需的点
rectSubTitle.left = sizeYTitle.cy + 8 + sizeYLabel.cx;
rectSubTitle.top = sizeTitle.cy + 3;
rectSubTitle.bottom = rectSubTitle.top + sizeSubTitle.cy + 4;
//right 待定
rectSubTitle.right = rectSubTitle.left + 2;
for(i=0; i<m_nChartCount; ++i)
{
CPen tmpPen;
CPen * pOldPen;
// 画线
pDC->MoveTo(rectSubTitle.right, (rectSubTitle.top + rectSubTitle.bottom) / 2);
tmpPen.CreatePen(PS_SOLID, 1, m_pChartItem[i]->m_color);
pOldPen = pDC->SelectObject(&tmpPen);
pDC->LineTo(rectSubTitle.right + 30, (rectSubTitle.top + rectSubTitle.bottom) / 2);
// 画图形
POINT Point[5];
Point[0].x = rectSubTitle.right + 13;
Point[0].y = (rectSubTitle.top + rectSubTitle.bottom) / 2 - 2;
Point[1].x = rectSubTitle.right + 17;
Point[1].y = Point[0].y;
Point[2].x = Point[1].x;
Point[2].y = (rectSubTitle.top + rectSubTitle.bottom) / 2 + 2;
Point[3].x = Point[0].x;
Point[3].y = Point[2].y;
Point[4].x = Point[0].x;
Point[4].y = Point[0].y;
pDC->Polyline(Point, 5);
pDC->SelectObject(pOldPen);
rectSubTitle.right += 31;
CSize sizeTemp;
sizeTemp = pDC->GetOutputTextExtent(m_pChartItem[i]->m_name);
pDC->TextOut(rectSubTitle.right, (rectSubTitle.top + rectSubTitle.bottom - sizeTemp.cy)/2, m_pChartItem[i]->m_name);
rectSubTitle.right += sizeTemp.cx + 2;
}
// 显示SUBTITLE的外框
if (m_nChartCount > 0)
{
CPen tmpPen;
tmpPen.CreatePen(PS_SOLID, 1, RGB(0,0,0));
pOldPen = pDC->SelectObject(&tmpPen);
POINT Point[5];
Point[0].x = rectSubTitle.left;
Point[0].y = rectSubTitle.top;
Point[1].x = rectSubTitle.right;
Point[1].y = rectSubTitle.top;
Point[2].x = rectSubTitle.right;
Point[2].y = rectSubTitle.bottom;
Point[3].x = rectSubTitle.left;
Point[3].y = rectSubTitle.bottom;
Point[4].x = rectSubTitle.left;
Point[4].y = rectSubTitle.top;
pDC->Polyline(Point, 5);
pDC->SelectObject(pOldPen);
}
pDC->SelectObject(pOldFont);
// 显示X/Y轴
rectFrame.left = sizeYTitle.cy + 8 + sizeYLabel.cx;
rectFrame.right = rectClient.right - 8;
rectFrame.top = rectSubTitle.bottom + 2;
rectFrame.bottom = rectClient.bottom - sizeXTitle.cy - sizeXLabel.cy - 10;
penFrame.CreatePen(PS_SOLID, 1, RGB(0,0,0));
pOldPen = pDC->SelectObject(&penFrame);
{
POINT Point[5];
Point[0].x = rectFrame.left;
Point[0].y = rectFrame.top;
Point[1].x = rectFrame.right;
Point[1].y = rectFrame.top;
Point[2].x = rectFrame.right;
Point[2].y = rectFrame.bottom;
Point[3].x = rectFrame.left;
Point[3].y = rectFrame.bottom;
Point[4].x = rectFrame.left;
Point[4].y = rectFrame.top;
pDC->Polyline(Point, 5);
}
// X轴线
m_AxresInfor[0].Ratio = (double)m_AxresInfor[0].Layers * m_AxresInfor[0].UnitValue * 1.0 / rectFrame.Width();
// 使用字体XLabel
pOldFont = pDC->SelectObject(&fontAxresLabel[0]);
for(i=0; i<=m_AxresInfor[0].Layers; ++i)
{
// label and line
pDC->MoveTo(rectFrame.left + i * m_AxresInfor[0].UnitValue / m_AxresInfor[0].Ratio, rectFrame.bottom + 4);
pDC->LineTo(rectFrame.left + i * m_AxresInfor[0].UnitValue / m_AxresInfor[0].Ratio, rectFrame.bottom - 4);
pDC->MoveTo(rectFrame.left + i * m_AxresInfor[0].UnitValue / m_AxresInfor[0].Ratio, rectFrame.top + 4);
pDC->LineTo(rectFrame.left + i * m_AxresInfor[0].UnitValue / m_AxresInfor[0].Ratio, rectFrame.top);
// label
CString strLabel;
strLabel.Format("%d", (int)((m_AxresInfor[0].BaseValue + i * m_AxresInfor[0].UnitValue) / (m_AxresInfor[0].Transformer)));
CSize sizeTemp;
sizeTemp = pDC->GetOutputTextExtent(strLabel);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -