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

📄 recordgraph.cpp

📁 一款不错的关于绘制波形编程的软件源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -