📄 curveview.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 + -