📄 grdemoview.cpp
字号:
// GrDemoView.cpp : implementation of the CGrDemoView class
//
#include "stdafx.h"
#include "GrDemo.h"
#include "MainFrm.h"
#include "GrDemoDoc.h"
#include "GrDemoView.h"
#include "ZoomDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CGrDemoView
IMPLEMENT_DYNCREATE(CGrDemoView, CScrollView)
BEGIN_MESSAGE_MAP(CGrDemoView, CScrollView)
//{{AFX_MSG_MAP(CGrDemoView)
ON_WM_ERASEBKGND()
ON_WM_SIZE()
ON_COMMAND(ID_TYPE_LINEAR, OnTypeLinear)
ON_UPDATE_COMMAND_UI(ID_TYPE_LINEAR, OnUpdateTypeLinear)
ON_COMMAND(ID_TYPE_XLOG, OnTypeXlog)
ON_UPDATE_COMMAND_UI(ID_TYPE_XLOG, OnUpdateTypeXlog)
ON_COMMAND(ID_TYPE_YLOG, OnTypeYlog)
ON_UPDATE_COMMAND_UI(ID_TYPE_YLOG, OnUpdateTypeYlog)
ON_COMMAND(ID_TYPE_XLOGYLOG, OnTypeXlogylog)
ON_UPDATE_COMMAND_UI(ID_TYPE_XLOGYLOG, OnUpdateTypeXlogylog)
ON_COMMAND(ID_TYPE_GRID, OnTypeGrid)
ON_UPDATE_COMMAND_UI(ID_TYPE_GRID, OnUpdateTypeGrid)
ON_COMMAND(ID_TYPE_BOUNDARY, OnTypeBoundary)
ON_UPDATE_COMMAND_UI(ID_TYPE_BOUNDARY, OnUpdateTypeBoundary)
ON_COMMAND(ID_TYPE_LEGEND, OnTypeLegend)
ON_UPDATE_COMMAND_UI(ID_TYPE_LEGEND, OnUpdateTypeLegend)
ON_COMMAND(ID_TYPE_BACKCOLOR, OnTypeBackcolor)
ON_UPDATE_COMMAND_UI(ID_TYPE_BACKCOLOR, OnUpdateTypeBackcolor)
ON_COMMAND(ID_TYPE_TITLE, OnTypeTitle)
ON_UPDATE_COMMAND_UI(ID_TYPE_TITLE, OnUpdateTypeTitle)
ON_COMMAND(ID_TYPE_MEMORYDRAW, OnTypeMemorydraw)
ON_UPDATE_COMMAND_UI(ID_TYPE_MEMORYDRAW, OnUpdateTypeMemorydraw)
ON_COMMAND(ID_MAPS_1MAP, OnMaps1map)
ON_UPDATE_COMMAND_UI(ID_MAPS_1MAP, OnUpdateMaps1map)
ON_COMMAND(ID_MAPS_2MAPS, OnMaps2maps)
ON_UPDATE_COMMAND_UI(ID_MAPS_2MAPS, OnUpdateMaps2maps)
ON_COMMAND(ID_MAPS_4MAPS, OnMaps4maps)
ON_UPDATE_COMMAND_UI(ID_MAPS_4MAPS, OnUpdateMaps4maps)
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_COMMAND(ID_ZOOM_RANDOM, OnZoomRandom)
ON_UPDATE_COMMAND_UI(ID_ZOOM_RANDOM, OnUpdateZoomRandom)
ON_COMMAND(ID_ZOOM_RECTANGLE, OnZoomRectangle)
ON_UPDATE_COMMAND_UI(ID_ZOOM_RECTANGLE, OnUpdateZoomRectangle)
ON_COMMAND(ID_ZOOM_DRAG, OnZoomDrag)
ON_UPDATE_COMMAND_UI(ID_ZOOM_DRAG, OnUpdateZoomDrag)
ON_COMMAND(ID_ZOOM_IN, OnZoomIn)
ON_UPDATE_COMMAND_UI(ID_ZOOM_IN, OnUpdateZoomIn)
ON_COMMAND(ID_ZOOM_OUT, OnZoomOut)
ON_UPDATE_COMMAND_UI(ID_ZOOM_OUT, OnUpdateZoomOut)
ON_COMMAND(ID_ZOOM_NONE, OnZoomNone)
ON_UPDATE_COMMAND_UI(ID_ZOOM_NONE, OnUpdateZoomNone)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGrDemoView construction/destruction
CGrDemoView::CGrDemoView()
{
m_fXScale = 1.0f; // zooming scale
m_fYScale = 1.0f;
m_fDelta = 1.2f;
m_nMapMode = MM_TEXT;
m_bCanDraw = TRUE;
m_bMemDraw = TRUE;
m_bTitle = TRUE;
m_bLegend = TRUE;
m_bBoundary = FALSE;
m_bGrid = TRUE;
m_nMaps = MAPS4;
m_ZoomDrag = RECTZOOMIN;
// init
m_pGraph = &m_Linear;
m_nBkColor = m_pGraph->GetBackColor();
m_pGraph->SetRange(0, 0, 100, 100);
m_pGraph->EnableMemoryDraw(m_bMemDraw);
m_pGraph->EnableLegend(m_bLegend);
m_pGraph->SetBackColor(m_nBkColor);
}
CGrDemoView::~CGrDemoView()
{
}
BOOL CGrDemoView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
void CGrDemoView::DrawFrame(CRect& rect, COLORREF cr, const char* Title)
{
m_pGraph->RecalcRects(rect);
if (m_bBoundary)
m_pGraph->DrawBoundary(cr, 2);
if (m_bTitle)
{
m_pGraph->XAxisTitle("X Axis");
m_pGraph->YAxisTitle("Y Axis");
m_pGraph->Title(Title);
}
m_pGraph->Axes();
if (m_bGrid)
m_pGraph->Grid();
}
void CGrDemoView::Draw4Maps(CRect& rect)
{
CGrDemoDoc* pDoc = GetDocument();
m_pGraph->SetRatio(0, 0, 0.5, 0.5);
DrawFrame(rect, RGB(255, 0, 0), "Map 1");
m_pGraph->Lines(pDoc->x, pDoc->y, 5, RGB(0, 0, 255), 1, "Line 1");
m_pGraph->Markers(pDoc->x, pDoc->y, 5, RGB(255, 0, 0), m_pGraph->CROSS, 2, "Food");
m_pGraph->Lines(pDoc->pt, 5, RGB(0, 128, 255), 3, "Line 3");
m_pGraph->Markers(pDoc->pt, 5, RGB(255, 0, 255), m_pGraph->FCIRCLE, 4, "Dog");
m_pGraph->SetRatio(0.5, 0, 1, 0.5);
DrawFrame(rect, RGB(255, 0, 255), "Map 2");
m_pGraph->Lines(pDoc->x, pDoc->y, 5, RGB(0, 0, 255), 1, "Line 1");
m_pGraph->Markers(pDoc->x, pDoc->y, 5, RGB(255, 0, 0), m_pGraph->DIAMOND, 2, "Fish", 4);
m_pGraph->Lines(pDoc->pt, 5, RGB(128, 0, 255), 3, "Line 3");
m_pGraph->Markers(pDoc->pt, 5, RGB(255, 0, 255), m_pGraph->CIRCLE, 4, "Dog", 4);
m_pGraph->SetRatio(0, 0.5, 0.5, 1);
DrawFrame(rect, RGB(128, 128, 0), "Map 3");
m_pGraph->Lines(pDoc->x, pDoc->y, 5, RGB(0, 0, 255), 1, "Line 1");
m_pGraph->Markers(pDoc->x, pDoc->y, 5, RGB(255, 0, 0), m_pGraph->FTRIANGLE, 2, "Food");
m_pGraph->Lines(pDoc->pt, 5, RGB(0, 0, 128), 3, "Line 3");
m_pGraph->Markers(pDoc->pt, 5, RGB(255, 128, 0), m_pGraph->STAR, 4, "Dog");
m_pGraph->SetRatio(0.5, 0.5, 1, 1);
DrawFrame(rect, RGB(0, 255, 128), "Map 4");
m_pGraph->Lines(pDoc->x, pDoc->y, 5, RGB(0, 0, 255), 1, "Line 1");
m_pGraph->Markers(pDoc->x, pDoc->y, 5, RGB(255, 0, 128), m_pGraph->TRIANGLE, 2, "Food", 4);
m_pGraph->Lines(pDoc->pt, 5, RGB(0, 255, 255), 3, "Line 3");
m_pGraph->Markers(pDoc->pt, 5, RGB(128, 128, 128), m_pGraph->FSQUARE, 4, "Cat", 4);
}
void CGrDemoView::Draw2Maps(CRect& rect)
{
CGrDemoDoc* pDoc = GetDocument();
m_pGraph->SetRatio(0, 0, 0.5, 1);
DrawFrame(rect, RGB(255, 0, 0), "Map 1");
m_pGraph->Lines(pDoc->x, pDoc->y, 5, RGB(0, 0, 255), 1, "Line 1");
m_pGraph->Markers(pDoc->x, pDoc->y, 5, RGB(255, 0, 0), m_pGraph->XCROSS, 2, "Food");
m_pGraph->Lines(pDoc->pt, 5, RGB(0, 128, 255), 3, "Line 3");
m_pGraph->Markers(pDoc->pt, 5, RGB(255, 0, 255), m_pGraph->FCIRCLE, 4, "Dog");
m_pGraph->SetRatio(0.5, 0, 1, 1);
DrawFrame(rect, RGB(255, 0, 255), "Map 2");
m_pGraph->Lines(pDoc->x, pDoc->y, 5, RGB(0, 0, 255), 1, "Line 1");
m_pGraph->Markers(pDoc->x, pDoc->y, 5, RGB(255, 0, 0), m_pGraph->FDIAMOND, 2, "Fish", 4);
m_pGraph->Lines(pDoc->pt, 5, RGB(128, 0, 255), 3, "Line 3");
m_pGraph->Markers(pDoc->pt, 5, RGB(255, 0, 255), m_pGraph->SQUARE, 4, "Dog", 4);
}
void CGrDemoView::Draw1Map(CRect& rect)
{
CGrDemoDoc* pDoc = GetDocument();
m_pGraph->SetRatio(0, 0, 1, 1);
DrawFrame(rect, RGB(255, 0, 0), "Shapes");
m_pGraph->MoveTo(CTPoint<float>(2, 2));
m_pGraph->LineTo(CTPoint<float>(95, 95));
m_pGraph->FilledRectangle(60, 60, 90, 90, RGB(128, 0, 128));
m_pGraph->Rectangle(70, 10, 90, 40);
m_pGraph->Lines(pDoc->x, pDoc->y, 5, RGB(0, 0, 255), 1, "Line 1");
m_pGraph->Markers(pDoc->x, pDoc->y, 5, RGB(255, 0, 0), m_pGraph->XCROSS, 2, "Food");
m_pGraph->FilledPolygon(pDoc->pt, 5, RGB(0, 255, 0));
POINT pt = m_pGraph->GetTPoint(CTPoint<float>(20, 36));
TRACE("x = %d, y = %d\n", pt.x, pt.y);
CPoint pt1(300, 38);
CTPoint<float> p1 = m_pGraph->GetTValue(pt1);
TRACE("x = %f, y = %f\n", p1.x, p1.y);
float x0 = 10, y0 = 5;
for(int i = m_pGraph->CROSS; i <= m_pGraph->DIAMOND; i++)
{
m_pGraph->Marker(x0, y0, i);
y0 += 15;
}
x0 = 90, y0 = 5;
HBRUSH hBrush = ::CreateSolidBrush(RGB(255, 0, 0));
HBRUSH hBrold = (HBRUSH)::SelectObject(m_pGraph->GetHDC(), hBrush);
for(i = m_pGraph->SQUARE; i <= m_pGraph->FSQUARE; i++)
{
m_pGraph->Marker(x0, y0, i, 4);
y0 += 18;
}
::SelectObject(m_pGraph->GetHDC(), hBrold);
::DeleteObject(hBrush);
}
/////////////////////////////////////////////////////////////////////////////
// CGrDemoView drawing
void CGrDemoView::OnDraw(CDC* pDC)
{
CGrDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!m_bCanDraw)
return;
CRect rect;
if (pDC->IsPrinting())
{
rect.left = rect.top = 0;
rect.right = pDC->GetDeviceCaps(HORZRES);
rect.bottom = pDC->GetDeviceCaps(VERTRES);
m_pGraph->SetPrintScale(pDC->m_hDC, rect);
}
else
{
CSize size = GetTotalSize();
rect.left = rect.top = 0;
rect.right = size.cx;
rect.bottom= size.cy;
}
m_pGraph->BeginDraw(pDC->m_hDC);
switch(m_nMaps)
{
case MAPS4:
Draw4Maps(rect);
break;
case MAPS2:
Draw2Maps(rect);
break;
case MAP1:
Draw1Map(rect);
break;
}
m_pGraph->EndDraw(pDC->m_hDC);
}
/////////////////////////////////////////////////////////////////////////////
// CGrDemoView printing
BOOL CGrDemoView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CGrDemoView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CGrDemoView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CGrDemoView diagnostics
#ifdef _DEBUG
void CGrDemoView::AssertValid() const
{
CScrollView::AssertValid();
}
void CGrDemoView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CGrDemoDoc* CGrDemoView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGrDemoDoc)));
return (CGrDemoDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CGrDemoView message handlers
BOOL CGrDemoView::OnEraseBkgnd(CDC* pDC)
{
if (!m_bCanDraw || !m_pGraph->m_bMemoryDraw)
return CScrollView::OnEraseBkgnd(pDC) ;
return TRUE;
}
void CGrDemoView::OnSize(UINT nType, int cx, int cy)
{
CScrollView::OnSize(nType, cx, cy);
if(cx <= 0 || cy <= 0)
return;
RecalcSize();
}
void CGrDemoView::RecalcSize()
{
CRect rect;
CSize sizeTotal;
if(fabs(m_fXScale - 1) < 0.000001 && fabs(m_fYScale - 1) < 0.000001)
{
GetClientRect(rect);
sizeTotal = rect.Size();
SetScaleToFitSize(sizeTotal); // make it similar to CView
}
else
{
sizeTotal = GetTotalSize();
rect.left = rect.top = 0;
rect.right = sizeTotal.cx;
rect.bottom = sizeTotal.cy;
SetScrollSizes(m_nMapMode, sizeTotal);
}
if(m_bCanDraw)
m_pGraph->RecalcRects(rect);
}
void CGrDemoView::Redraw()
{
RecalcSize();
Invalidate();
}
void CGrDemoView::OnTypeLinear()
{
m_pGraph = &m_Linear;
m_pGraph->SetRange(0, 0, 100, 100);
Redraw();
}
void CGrDemoView::OnUpdateTypeLinear(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_pGraph == &m_Linear);
}
void CGrDemoView::OnTypeXlog()
{
m_pGraph = &m_XLogYLinear;
if (!m_pGraph->SetRange(1, 0, 100, 100))
{
m_bCanDraw = FALSE;
MessageBox("Setting Range failed");
return;
}
Redraw();
}
void CGrDemoView::OnUpdateTypeXlog(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_pGraph == &m_XLogYLinear);
}
void CGrDemoView::OnTypeYlog()
{
m_pGraph = &m_XLinearYLog;
if (!m_pGraph->SetRange(0, 1, 100, 100))
{
m_bCanDraw = FALSE;
MessageBox("Setting Range failed");
return;
}
Redraw();
}
void CGrDemoView::OnUpdateTypeYlog(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_pGraph == &m_XLinearYLog);
}
void CGrDemoView::OnTypeXlogylog()
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -