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

📄 curveview.cpp

📁 本程序源码是为日本一家地震监测机构编写的
💻 CPP
字号:
// CurveView.cpp : implementation file
//

#include "stdafx.h"
#include "CQuakeDemo.h"
#include "CurveView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CCurveView

IMPLEMENT_DYNCREATE(CCurveView, CBaseView)

CCurveView::CCurveView()
{
	m_borCor		=	RGB(173,166,173);
	m_FormLineCor	=	RGB(140,  0,  0);
	m_CurveLineCor	=	RGB(0,255,0);
	m_nXForm		=	8/*10*/;
	m_nYForm		=	8/*16*/;
	
	m_pFileManager	=	NULL;
	
	m_UpLimit		=	0.0002;
	m_nBufferSize	=	500;
	
	m_bAuto			=	TRUE;

	m_TopCurveCor	= RGB(255,255,0);
	m_FirstCurveCor = RGB(0,255,0);
}

CCurveView::~CCurveView()
{
}


BEGIN_MESSAGE_MAP(CCurveView, CBaseView)
	//{{AFX_MSG_MAP(CCurveView)
	ON_WM_SIZE()
	ON_WM_ERASEBKGND()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCurveView drawing

void CCurveView::OnDraw(CDC* pDC)
{
	CDocument* pDoc = GetDocument();
	// TODO: add draw code here
	CRect ClientRect;
	GetClientRect(ClientRect);
	CalcDrawRect(ClientRect);
	BitBltMemDC(pDC);
}

/////////////////////////////////////////////////////////////////////////////
// CCurveView diagnostics

#ifdef _DEBUG
void CCurveView::AssertValid() const
{
	CBaseView::AssertValid();
}

void CCurveView::Dump(CDumpContext& dc) const
{
	CBaseView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CCurveView message handlers
void CCurveView::CalcDrawRect(CRect &DrawRect)
{
	m_DrawRect = DrawRect;
	CRectPlus::DivideRectV(m_DrawRect,30,m_TitleRect,m_FormRect);
	CRectPlus::DivideRectV(m_FormRect,-60,m_FormRect,m_InformationRect);
	m_FormRect.DeflateRect(5,5,5,5);
}

void CCurveView::DrawFormLine(CDC *pDC)
{	
	DrawFormLineEx(pDC,m_DrawRect,m_FormRect);
}

void CCurveView::DrawFormLineEx(CDC *pDC, CRect mainrect, CRect formrect)
{
	//画XY方向的网格线并保存到XY的链表中去
//	pDC->Draw3dRect(&mainrect, m_borCor,m_borCor);
	//设置画笔字体////////////////////
	CPen newpen;
	CPen* oldpen;
	newpen.CreatePen(PS_SOLID, 1, m_FormLineCor);
	oldpen = pDC->SelectObject(&newpen);
	//
	m_xPtList.RemoveAll();
	m_yPtList.RemoveAll();
	CPoint pt;
	int counter = formrect.left;
	
	for(int i = 0; i < m_nXForm+1; i++)
	{
		//画Y方向的网格线
		pDC->MoveTo(counter,formrect.top);
		pDC->LineTo(counter,formrect.bottom);
		//保存x方向单位点链表
		pt.x = counter;
		pt.y = formrect.bottom;
		m_xPtList.Add(pt);
		//X坐标累加
		counter = formrect.left + (i+1)*formrect.Width()/m_nXForm;
	}
	counter = formrect.top;
	for(int j = 0; j < m_nYForm+1; j++)
	{
		//画X方向横线
		pDC->MoveTo(formrect.left,counter);
		pDC->LineTo(formrect.right,counter);
		//保存y方向单位点链表
		pt.x = formrect.left;
		pt.y = counter;
		m_yPtList.Add(pt);
		//Y坐标累加
		counter = formrect.top+(j+1)*formrect.Height()/m_nYForm;		
	}
	pDC->SelectObject(oldpen);
}

void CCurveView::DrawFormText(CDC* pDC)
{
	CFont font, *pOldFont;
	CreateFont(font,12);
	pOldFont = (CFont*) pDC->SelectObject(&font);
	int iOldBkMode = pDC->SetBkMode(TRANSPARENT);
	pDC->SetTextColor(RGB(0,255,0));
	//////////////////////////////////////////////////////////////////////
	if(m_DrawBuffer1.GetCount() != 0)
	{
		CString str;
		str.Format(_T("%f"),m_UpLimit);
		pDC->TextOut(m_yPtList.GetAt(0).x,m_yPtList.GetAt(0).y,str);
		
		str.Format(_T("%d"),m_DrawBuffer1.GetHead().Time);		
		pDC->TextOut(m_xPtList.GetAt(8).x - pDC->GetTextExtent(str).cx,m_xPtList.GetAt(8).y - pDC->GetTextExtent(str).cy,str);
		//////////////////////////////////////////////////////////////////////
	}
	pDC->SetBkMode(iOldBkMode);
	pDC->SelectObject(pOldFont);
	font.DeleteObject();
}

void CCurveView::DrawCurve(CDC* pDC,CPen &CurvePen, DrawBuffer *pBuffer)
{
	CPen* oldpen;
	oldpen = pDC->SelectObject(&CurvePen);
	//绘制曲线//////////////////////////////////////
	int midheight  = (m_FormRect.top + m_FormRect.bottom)/2;
	int halfheight = m_FormRect.Height()/2;	
	int iwidth     = m_FormRect.Width();    
	
	double xrate,yrate;
	int dx,dy;
	
	POSITION Pos = pBuffer->GetHeadPosition();
	for(int i = 0; i < m_nBufferSize; i++)
	{
		xrate = i;
		dx = m_FormRect.right - int((xrate/m_nBufferSize) * iwidth);

		if(Pos == NULL)break;
		yrate = pBuffer->GetNext(Pos).Disp;
		dy = midheight + int((yrate/m_UpLimit) * halfheight *(-1));
		if( i == 0)
			pDC->MoveTo(dx,dy);
		else
			pDC->LineTo(dx,dy);
	}
	pDC->SelectObject(oldpen);
}

void CCurveView::CreateMemPic(CDC *pDC)
{
	CDC *pMemDC = CreateMemDC(pDC);
	//绘制图片
	pMemDC->FillSolidRect(m_DrawRect,RGB(0,0,0));
	DrawTitleRect(pMemDC);
	DrawFormLine(pMemDC);
	DrawFormText(pMemDC);
	DrawInformationRect(pMemDC);
	//
	CPen Pen1,Pen2;
	Pen1.CreatePen(PS_SOLID, 1, m_FirstCurveCor);
	Pen2.CreatePen(PS_SOLID, 1, m_TopCurveCor);
	AutoHight(&m_DrawBuffer1);
	DrawCurve(pMemDC,Pen1,&m_DrawBuffer1);
	DrawCurve(pMemDC,Pen2,&m_DrawBuffer2);
}

void CCurveView::DrawTitleRect(CDC* pDC)
{
	CFont font, *pOldFont;
	CreateFont(font,14);
	pOldFont = (CFont*) pDC->SelectObject(&font);
	int iOldBkMode = pDC->SetBkMode(TRANSPARENT);
	pDC->SetTextColor(RGB(0,255,0));
	//////////////////////////////////////////////////////////////////////
	pDC->DrawText("Curve",m_TitleRect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
	//////////////////////////////////////////////////////////////////////
	pDC->SetBkMode(iOldBkMode);
	pDC->SelectObject(pOldFont);
	font.DeleteObject();
}

void CCurveView::DrawInformationRect(CDC* pDC)
{
	CFont font, *pOldFont;
	CreateFont(font,12);
	pOldFont = (CFont*) pDC->SelectObject(&font);
	int iOldBkMode = pDC->SetBkMode(TRANSPARENT);
	pDC->SetTextColor(RGB(0,255,0));
	//////////////////////////////////////////////////////////////////////
	pDC->DrawText("Curve Information",m_InformationRect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
	//////////////////////////////////////////////////////////////////////
	pDC->SetBkMode(iOldBkMode);
	pDC->SelectObject(pOldFont);
	font.DeleteObject();
}

void CCurveView::AutoHight(DrawBuffer *pBuffer)
{
	double MaxValue = 0;
	static DispStruct disp;

	POSITION Pos = pBuffer->GetHeadPosition();
	while(Pos != NULL)
	{
		disp = pBuffer->GetNext(Pos);
		if( fabs(disp.Disp) > MaxValue)
			MaxValue = fabs(disp.Disp);	
	}
	if(MaxValue < m_UpLimit*0.15)m_UpLimit = m_UpLimit * double(0.1);
	else if(MaxValue > m_UpLimit)m_UpLimit = MaxValue * double(1.1);
}

double CCurveView::GetUpLimit() const
{
	return m_UpLimit;
}

void CCurveView::SetUpLimit(double UpLimit)
{
	m_UpLimit = UpLimit;
}

void CCurveView::OnSize(UINT nType, int cx, int cy) 
{
	CBaseView::OnSize(nType, cx, cy);
	UpdateView();	
}

BOOL CCurveView::OnEraseBkgnd(CDC* pDC) 
{
	return TRUE;	
}

void CCurveView::TimeProc()
{
	static DispStruct dispitem;
	m_pFileManager->GetStepData(0,dispitem);
	m_DrawBuffer1.AddHead(dispitem);

	m_pFileManager->GetStepData((m_pFileManager->GetFileCount()-1),dispitem);
	m_DrawBuffer2.AddHead(dispitem);

	if(m_DrawBuffer1.GetCount() > m_nBufferSize)
	{
		m_DrawBuffer1.RemoveTail();
		m_DrawBuffer2.RemoveTail();
	}
}

void CCurveView::SetFileManager(CQuakeFileManager* pFileManager)
{
	ASSERT(pFileManager != NULL);
	m_pFileManager = pFileManager;
}

void CCurveView::ClearView()
{
	m_DrawBuffer1.RemoveAll();
	m_DrawBuffer2.RemoveAll();
}

void CCurveView::UpdateView()
{
	CRect ClientRect;
	GetClientRect(ClientRect);
	CalcDrawRect(ClientRect);
	CClientDC dc(this);
	CreateMemPic(&dc);
	InvalidateRect(m_DrawRect);
}





































⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -