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; 
}