www.pudn.com > drawpad.zip > eellipse.cpp
#include "stdafx.h"
#include "eellipse.h"
#include "pickevent.h"
// This file gives implementation of following class
// ELINE
IMPLEMENT_SERIAL(EELLIPSE, ENTITY, 0);
void EELLIPSE::Serialize(CArchive &ar)
{
ENTITY::Serialize(ar);
if (ar.IsStoring())
{
ar << m_nStart << m_nEnd;
}
else
{
ar >> m_nStart >> m_nEnd;
}
}
// copy data from another entity.
int EELLIPSE::CopyData(ENT *another)
{
if( !another ) return 0;
ASSERT(another->IsKindOf(RUNTIME_CLASS(EELLIPSE)));
EELLIPSE *other = (EELLIPSE *)another;
ENTITY::CopyData(another);
m_nStart = other->get_start();
m_nEnd = other->get_end();
return 1;
}
EELLIPSE::EELLIPSE()
{
}
EELLIPSE::EELLIPSE(const CPoint &p1, const CPoint &p2,int iWidth,COLORREF Color,UINT linestyle)
{
m_nStart = p1;
m_nEnd = p2;
set_line_width(iWidth);
set_color(Color);
set_line_style(linestyle);
}
int EELLIPSE::GetGripper(int iGrip, CPoint &pnt)
{
switch( iGrip ) {
case 1:
pnt = m_nStart;
return 1;
case 2:
pnt = m_nEnd;
return 1;
default:
return 0;
}
}
void EELLIPSE::Draw(CDC *pDC, int state)
{
SetPen(pDC, state);
pDC->SelectStockObject(NULL_BRUSH);
CPen *oldpen = pDC->SelectObject(&DTPen);
CRect rect(m_nStart,m_nEnd);
pDC->Ellipse(rect);
//pDC->MoveTo(m_nStart);
//pDC->LineTo(m_nEnd);
ENTITY::Draw(pDC, state);
pDC->SelectObject(oldpen);
}
int EELLIPSE::HitTest(CDC *pDC, const PICK_EVENT& pe)
{
CPoint p(pe.x(),pe.y());
CRect rect(m_nStart,m_nEnd);
float a=abs(m_nEnd.x-m_nStart.x)/2.0;
float b=abs(m_nEnd.y-m_nStart.y)/2.0;
if(((p.x*p.x)/(a*a)+(p.y*p.y)/(b*b)-1.0)<1)
return 1;
else
return 0;
}