📄 recordgraph.cpp
字号:
// RecordGraph.cpp : implementation file
//
#include "stdafx.h"
#include "RecordGraph.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CRecordGraph
CRecordGraph::CRecordGraph()
{
m_bkColor = RGB(0, 0, 0);
m_scaleColor = RGB(255, 255, 255);
m_leftMargin = 40;
m_rightMargin = 20;
m_topMargin = m_bottomMargin = 20;
m_gridWidth = m_gridHeight = 20;
RegisterWndClass();
m_scaleFont.CreateFont(14,
0,
0,
0,
FW_NORMAL,
FALSE,
FALSE,
0,
DEFAULT_CHARSET ,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH | FF_SWISS,
_T("Arial"));
m_FilePath = NULL;
nCheck = 0;
bDrawBaseLineOne = FALSE;
bDrawBaseLineTwo = FALSE;
}
CRecordGraph::~CRecordGraph()
{
m_FilePath = NULL;
nCheck = 0;
bDrawBaseLineOne = FALSE;
bDrawBaseLineTwo = FALSE;
}
BEGIN_MESSAGE_MAP(CRecordGraph, CWnd)
//{{AFX_MSG_MAP(CRecordGraph)
ON_WM_CREATE()
ON_WM_ERASEBKGND()
ON_WM_PAINT()
ON_WM_SIZE()
ON_WM_LBUTTONDBLCLK()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_GRAPHMESSAGE,OnGraphMessage)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CRecordGraph message handlers
BOOL CRecordGraph::RegisterWndClass()
{
WNDCLASS wndClass;
HINSTANCE hInst = AfxGetInstanceHandle();
//Check weather the class is registerd already
if (!(::GetClassInfo(hInst, RECORDGRAPHCLASS, &wndClass)))
{
//If not then we have to register the new class
wndClass.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
wndClass.lpfnWndProc = ::DefWindowProc;
wndClass.cbClsExtra = wndClass.cbWndExtra = 0;
wndClass.hInstance = hInst;
wndClass.hIcon = NULL;
wndClass.hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
wndClass.hbrBackground = ::GetSysColorBrush(COLOR_WINDOW);
wndClass.lpszMenuName = NULL;
wndClass.lpszClassName = RECORDGRAPHCLASS;
if (!AfxRegisterClass(&wndClass))
{
AfxThrowResourceException();
return FALSE;
}
}
return TRUE;
}
int CRecordGraph::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
return 0;
}
BOOL CRecordGraph::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
// return CWnd::OnEraseBkgnd(pDC);
return TRUE;
}
void CRecordGraph::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CDC memdc;
memdc.CreateCompatibleDC(&dc);
GetClientRect(&m_rcClient);
TRACE(_T("OnPaint rc: %d, %d\n"), m_rcClient.Width(), m_rcClient.Height());
CBitmap bmp;
bmp.CreateCompatibleBitmap(&dc, m_rcClient.Width(), m_rcClient.Height());
CBitmap *pOldBmp = memdc.SelectObject(&bmp);
memdc.FillSolidRect(&m_rcClient, m_bkColor);
// draw graph in memdc
DrawGraph(&memdc);
StretchBlt(dc, 0, 0, m_rcClient.Width(), m_rcClient.Height(),
memdc, 0, 0, m_rcClient.Width(), m_rcClient.Height(),
SRCCOPY);
memdc.SelectObject(pOldBmp);
bmp.DeleteObject();
// Do not call CWnd::OnPaint() for painting messages
}
void CRecordGraph::DrawGraph(CDC* pDC)
{
CPen axisPen(PS_SOLID, 1, RGB(255, 255, 255));
CPen gridPen(PS_DOT, 1, RGB(255, 255, 255));
CPen vavePen(PS_SOLID,1,RGB(0, 255, 0)); //zxb add
AdjustGridMargin();
DrawGrids(pDC, axisPen, gridPen);
DrawTimeAxisScales(pDC);
if(m_FilePath)
{
DrawStreamGraph(pDC, vavePen,m_FilePath); // zxb add
// 红色画笔
CPen PenRed(PS_SOLID,2,RGB(255,0,0));
// 选中当前红色画笔,并保存以前的画笔
CPen* pOldPen = pDC->SelectObject(&PenRed);
int nOldMode = pDC->SetBkMode(TRANSPARENT);
if( bDrawBaseLineOne)
{
pDC->MoveTo(XbaseLineOne,m_rcClient.bottom - m_bottomMargin);
pDC->LineTo(XbaseLineOne,m_rcClient.top + m_topMargin);
}
if( bDrawBaseLineTwo)
{
pDC->MoveTo(XbaseLineTwo,m_rcClient.bottom - m_bottomMargin);
pDC->LineTo(XbaseLineTwo,m_rcClient.top + m_topMargin);
}
pDC->SetBkMode(nOldMode);
pDC->SelectObject(pOldPen);
}
}
void CRecordGraph::DrawGrids(CDC* pDC, CPen& axisPen, CPen& gridPen)
{
CPen* pOldPen = pDC->SelectObject(&gridPen);
int nOldMode = pDC->SetBkMode(TRANSPARENT);
int nStartx = m_rcClient.left + m_leftMargin;
int nEndx = m_rcClient.right - m_rightMargin;
int nStarty = m_rcClient.bottom - m_bottomMargin;
int nEndy = m_rcClient.top + m_topMargin;
for (int x=nStartx+m_gridWidth; x<=nEndx; x+=m_gridWidth)
{
pDC->MoveTo(x, nStarty);
pDC->LineTo(x, nEndy);
}
for (int y=nStarty-m_gridHeight; y>=nEndy; y-=m_gridHeight)
{
pDC->MoveTo(nStartx, y);
pDC->LineTo(nEndx, y);
}
pDC->SelectObject(&axisPen);
pDC->MoveTo(nStartx, nEndy);
pDC->LineTo(nStartx, nStarty);
pDC->LineTo(nEndx, nStarty);
pDC->SetBkMode(nOldMode);
pDC->SelectObject(pOldPen);
}
void CRecordGraph::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
TRACE(_T("CRecordGraph::OnSize\n"));
// GetClientRect(&m_rcClient);
}
void CRecordGraph::SetMargin(int left, int top, int right, int bottom)
{
m_leftMargin = left;
m_topMargin = top;
m_rightMargin = right;
m_bottomMargin = bottom;
}
void CRecordGraph::SetGridSize(int width, int height)
{
ASSERT(width > 0);
ASSERT(height > 0);
m_gridWidth = width;
m_gridHeight = height;
}
void CRecordGraph::AdjustGridMargin()
{
m_xGridCount = (m_rcClient.Width() - m_leftMargin - m_rightMargin) / m_gridWidth;
int value = (m_rcClient.Width() - m_leftMargin - m_rightMargin) % m_gridWidth;
if (value)
{
m_rightMargin = m_rcClient.Width() - m_leftMargin - m_xGridCount * m_gridWidth;
while (m_rightMargin > m_gridWidth)
{
m_rightMargin -= m_gridWidth;
}
m_xGridCount = (m_rcClient.Width() - m_leftMargin - m_rightMargin) / m_gridWidth;
}
m_yGridCount = (m_rcClient.Height() - m_topMargin - m_bottomMargin) / m_gridHeight;
value = (m_rcClient.Height() - m_topMargin - m_bottomMargin) % m_gridHeight;
if (value)
{
m_topMargin = m_rcClient.Height() - m_bottomMargin - m_yGridCount * m_gridHeight;
while (m_topMargin > m_gridHeight)
{
m_topMargin -= m_gridHeight;
}
m_yGridCount = (m_rcClient.Height() - m_topMargin - m_bottomMargin) / m_gridHeight;
}
TRACE(_T("xcount = %d, ycount = %d, rightMargin = %d, topMargin = %d\n"),
m_xGridCount, m_yGridCount, m_rightMargin, m_topMargin);
}
void CRecordGraph::DrawTimeAxisScales(CDC* pDC)
{
CRect rcText;
CSize sizeText;
TCHAR szText[20] = {0};
int nBasex = m_rcClient.left + m_leftMargin;
int nBasey = m_rcClient.bottom - m_bottomMargin;
CFont* pOldFont = pDC->SelectObject(&m_scaleFont);
int oldBkMode = pDC->SetBkMode(TRANSPARENT);
COLORREF oldColor = pDC->SetTextColor(m_scaleColor);
CString strFormat;
strFormat.Format(_T("%%d"));
int value = 0;
for (int i=0; i<=m_xGridCount; i++)
{
// if (i == m_nXGrids && fHasUnit) break;
memset(szText, 0, sizeof(szText));
value += 1;
_stprintf(szText, strFormat, value);
sizeText = pDC->GetOutputTextExtent(szText);
rcText.left = nBasex + i*m_gridWidth - sizeText.cx/2;
rcText.right = rcText.left + sizeText.cx;
rcText.top = nBasey + 5;
rcText.bottom = rcText.top + sizeText.cy;
pDC->DrawText(szText, rcText, DT_RIGHT | DT_BOTTOM);
}
pDC->SetBkMode(oldBkMode);
pDC->SelectObject(pOldFont);
pDC->SetTextColor(oldColor);
}
void CRecordGraph::DrawStreamGraph(CDC *pDC, CPen &vavePen,LPCTSTR strFilePath)
{
TRY
{
COleDateTime t1(2008, 11, 17, 17, 20, 02);
COleDateTime t2(2008, 11, 17, 17, 29, 50);
CRecordFile file(strFilePath);
int count = file.GetDataPageCount();
CDataPage page;
m_nDrawPageNum = (((file.m_endPageIndex - file.m_startPageIndex)*6 + file.m_endRecordIndex - file.m_startRecordIndex + 1) + (m_rcClient.right - m_rightMargin - (m_rcClient.left + m_leftMargin) -1))\
/(m_rcClient.right - m_rightMargin - (m_rcClient.left + m_leftMargin));
// m_nCurDrawNum = ;
int nMax=0,nMin=0;
UINT nRecord;
file.GetDataPageAt(file.m_startPageIndex, &page);
nMax = page.pageAddr[page.dataOffset + page.dataSize*file.m_startRecordIndex];
for(UINT nPage=file.m_startPageIndex; nPage<=file.m_endPageIndex; nPage++)
{
file.GetDataPageAt(nPage, &page);
if(nPage == file.m_startPageIndex)
{
for(nRecord=file.m_startRecordIndex; nRecord<6; nRecord++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -