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

📄 grdemoview.cpp

📁 图像编程的参考资料
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -