Скачиваний:
18
Добавлен:
01.05.2014
Размер:
4.12 Кб
Скачать
// PointsView.cpp : implementation file
//

#include "stdafx.h"
#include "RegionSearch.h"
#include "PointsView.h"

#include "Trees.h"

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

/////////////////////////////////////////////////////////////////////////////
// CPointsView

IMPLEMENT_DYNCREATE(CPointsView, CView)

CPointsView::CPointsView()
{
}

CPointsView::~CPointsView()
{
}


BEGIN_MESSAGE_MAP(CPointsView, CView)
	//{{AFX_MSG_MAP(CPointsView)
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
	ON_WM_LBUTTONDBLCLK()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPointsView drawing

void CPointsView::OnDraw(CDC* pDC)
{
	CRegionSearchDoc* pDoc = GetDocument();
	
	if(pDoc->IsRegionDisplayed())
	{
		CRect rc=pDoc->GetRegion();
		rc.left = XToScreen(rc.left);
		rc.right = XToScreen(rc.right);
		rc.top = YToScreen(rc.top);
		rc.bottom = YToScreen(rc.bottom);
		pDC->Rectangle(&rc);
	}

	std::vector<Point>& Points = GetDocument()->Points;
	for(int i=0; i<Points.size(); i++)
	{
		pDC->Ellipse(XToScreen(Points[i].first)-2, YToScreen(Points[i].second)-2, 
			XToScreen(Points[i].first)+2, YToScreen(Points[i].second)+2);

		if(pDoc->GetShowNumbers())
		{
			std::ostringstream os;
			os<<Points[i].number;
			pDC->TextOut(XToScreen(Points[i].first)+3, 
				YToScreen(Points[i].second), os.str().c_str());
		}
	}

	const std::list<Point>& Results = GetDocument()->GetResult();
	if(Results.size()>0)
	{
		CBrush* pRedBrush = new CBrush(RGB(255,0,0));
		CBrush* pOldBrush = pDC->SelectObject(pRedBrush);

		std::list<Point>::const_iterator i1 = Results.begin();
		while(i1!=Results.end())
		{
			pDC->Ellipse(XToScreen(i1->first)-2, YToScreen(i1->second)-2, 
				XToScreen(i1->first)+2, YToScreen(i1->second)+2);
			i1++;
		}

		pDC->SelectObject(pOldBrush);
		delete pRedBrush;
	}

	if(pDoc->GetShowSegments())
	{
		CRect rc;
		GetClientRect(&rc);

		for(int i=0; i<Points.size(); i++)
		{
			pDC->MoveTo(XToScreen(Points[i].first), 30);
			pDC->LineTo(XToScreen(Points[i].first), rc.bottom);
			std::ostringstream os;
			os<<i+1;
			pDC->TextOut(XToScreen(Points[i].first)-5, 20, os.str().c_str());
		}

	}
	
}

/////////////////////////////////////////////////////////////////////////////
// CPointsView diagnostics

#ifdef _DEBUG
void CPointsView::AssertValid() const
{
	CView::AssertValid();
}

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

/////////////////////////////////////////////////////////////////////////////
// CPointsView message handlers

void CPointsView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	GetDocument()->StartEnterRegion(PointToLogical(point));	
	CView::OnLButtonDown(nFlags, point);
}

void CPointsView::OnMouseMove(UINT nFlags, CPoint point) 
{
	GetDocument()->ContinueEnterRegion(PointToLogical(point));	
	CView::OnMouseMove(nFlags, point);
}

void CPointsView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	GetDocument()->EndEnterRegion(PointToLogical(point));	
	CView::OnLButtonUp(nFlags, point);
}

void CPointsView::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	GetDocument()->EnterPoint(PointToLogical(point));	
	CView::OnLButtonDblClk(nFlags, point);
}

int CPointsView::XToScreen(int x)
{
	CRect rc;
	GetClientRect(&rc);
	return (x*rc.Width())/GetDocument()->GetWidth();
}

int CPointsView::YToScreen(int y)
{
	CRect rc;
	GetClientRect(&rc);
	return (y*rc.Height())/GetDocument()->GetHeight();
}

int CPointsView::XToLogical(int x)
{
	CRect rc;
	GetClientRect(&rc);
	if(rc.Width()>0)
		return (x*GetDocument()->GetWidth())/rc.Width();
	else
		return 0;
}

int CPointsView::YToLogical(int y)
{
	CRect rc;
	GetClientRect(&rc);
	if(rc.Height()>0)
		return (y*GetDocument()->GetHeight())/rc.Height();
	else 
		return 0;
}

CPoint CPointsView::PointToLogical(CPoint p)
{
	return CPoint(XToLogical(p.x), YToLogical(p.y));
}
Соседние файлы в папке Source