www.pudn.com > mischat.rar > Draw.cpp
// Line.cpp: implementation of the CLine class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Draw.h"
#include "tokenizer.h"
#include "math.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
IMPLEMENT_SERIAL(CCurve, CObject, 0)
CCurve::CCurve()
{
}
CCurve::~CCurve()
{
pointList.RemoveAll ();
}
void CCurve::AddPoint(CPoint point)
{
pointList.AddTail (point);
}
void CCurve::Init(UINT w,COLORREF c)
{
m_width=w;
m_crColor=c;
}
void CCurve::Draw(CDC *pDC)
{
ASSERT(m_width>=1 && m_width<=10);
CPen lpen(PS_SOLID,m_width,m_crColor);
CPen* pOldPen=pDC->SelectObject(&lpen);
POSITION ps;
CPoint p;
ps=pointList.GetHeadPosition ();
if(ps!=NULL) p=pointList.GetNext(ps);
pDC->MoveTo (p);
while(ps!=NULL){
p=pointList.GetNext (ps);
pDC->LineTo (p);
}
pDC->SelectObject(pOldPen);
}
void CCurve::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{ // storing code
ar<>m_width>>m_crColor;
}
pointList.Serialize (ar);
}
bool CCurve::HitTest(CPoint& pt,CDC* pDC)
{
bool rel=false;
CPoint p;
POSITION ps;
ps=pointList.GetHeadPosition ();
while(ps!=NULL){
p=pointList.GetNext (ps);
rel=(abs(pt.x-p.x)<=5) && (abs(pt.y-p.y)<=5);
if(rel) return rel;
}
return rel;
}
CRect CCurve::GetOutside(CDC *pDC)
{
LONG left,top,right,bottom;
POSITION ps;
CPoint p;
ps=pointList.GetHeadPosition ();
if(ps!=NULL){
p=pointList.GetNext(ps);
left=right=p.x ;
top=bottom=p.y ;
}
while(ps!=NULL){
p=pointList.GetNext (ps);
if(p.xright) right=p.x;
if(p.ybottom) bottom=p.y;
}
CRect rect;
rect.left =left;
rect.top =top;
rect.right =right;
rect.bottom =bottom;
rect.InflateRect (5,5);
return rect;
}
void CCurve::Offset(CSize& s)
{
POSITION ps;
ps=pointList.GetHeadPosition ();
while(ps!=NULL){
pointList.GetNext (ps).Offset (s);
}
}
IMPLEMENT_SERIAL(CLine, CObject, 0)
CLine::CLine()
{
}
CLine::~CLine()
{
}
CLine::CLine(CPoint ptFrom, CPoint ptTo,COLORREF crColor,UINT width)
{
m_ptFrom=ptFrom;
m_ptTo=ptTo;
m_crColor=crColor;
m_width=width;
}
void CLine::Draw(CDC *pDC)
{
ASSERT(m_width>=1 && m_width<=10);
CPen lpen(PS_SOLID,m_width,m_crColor);
CPen* pOldPen=pDC->SelectObject(&lpen);
pDC->MoveTo(m_ptFrom);
pDC->LineTo(m_ptTo);
pDC->SelectObject(pOldPen);
}
void CLine::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{ // storing code
ar<>m_ptFrom>>m_ptTo>>m_crColor>>m_width;
}
}
bool CLine::HitTest(CPoint& pt,CDC* pDC)
{
return IsOnline(m_ptFrom,m_ptTo,pt);
}
CRect CLine::GetOutside(CDC *pDC)
{
CRect rect(m_ptFrom,m_ptTo);
rect.NormalizeRect ();
rect.InflateRect (5,5);
return rect;
}
void CLine::Offset(CSize& s)
{
m_ptFrom.Offset (s);
m_ptTo.Offset (s);
}
IMPLEMENT_SERIAL(CText, CObject, 0)
CText::CText()
{
}
CText::~CText()
{
}
CText::CText(CPoint ptFrom,CString strText,LOGFONT lf,COLORREF crColor)
{
m_ptFrom=ptFrom;
m_crColor=crColor;
m_lf=lf;
m_strText=strText;
}
void CText::Draw(CDC *pDC)
{
CFont font;
CFont* def_font;
if(!font.CreateFontIndirect (&m_lf))
{
CFont* pfont = CFont::FromHandle ((HFONT) GetStockObject (DEFAULT_GUI_FONT));
def_font = pDC->SelectObject(pfont);
}
else def_font = pDC->SelectObject(&font);
int m=pDC->SetBkMode (TRANSPARENT);
COLORREF cr=pDC->SetTextColor (m_crColor);
pDC->TextOut (m_ptFrom.x ,m_ptFrom.y ,m_strText);
pDC->SelectObject(def_font);
pDC->SetTextColor(cr);
pDC->SetBkMode (m);
}
void CText::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{ // storing code
ar<>m_ptFrom>>m_crColor>>m_strText;
ar.Read (&m_lf,sizeof(LOGFONT));
}
}
bool CText::HitTest(CPoint& pt,CDC* pDC)
{
CRect rect=GetOutside(pDC);
rect.NormalizeRect ();
return rect.PtInRect (pt);
}
CRect CText::GetOutside(CDC *pDC)
{
CFont font;
CFont* def_font;
if(!font.CreateFontIndirect (&m_lf))
{
CFont* pfont = CFont::FromHandle ((HFONT) GetStockObject (DEFAULT_GUI_FONT));
def_font = pDC->SelectObject(pfont);
}
else def_font = pDC->SelectObject(&font);
return CRect(m_ptFrom,pDC->GetTextExtent (m_strText));
}
void CText::Offset(CSize& s)
{
m_ptFrom.Offset (s);
}
IMPLEMENT_SERIAL(CRectangle, CObject, 0)
CRectangle::CRectangle()
{
}
CRectangle::~CRectangle()
{
}
CRectangle::CRectangle(CRect rect,COLORREF crPen,COLORREF crBrush,UINT width,int shape)
{
m_rect=rect;
m_crPen=crPen;
m_crBrush=crBrush;
m_width=width;
DrawShape=shape;
}
void CRectangle::Draw(CDC *pDC)
{
ASSERT(m_width>=1 && m_width<=10);
CPen* pOldPen;
CBrush* pOldBrush;
CPen pen(PS_SOLID,m_width,m_crPen);
CBrush brush(m_crBrush);
int xCorner=m_rect.Width ()/4;
int yCorner=m_rect.Height ()/4;
CPoint point;
point.x =point.y=xCornerSelectObject(&pen);
pOldBrush=pDC->SelectObject(&brush);
pDC->Rectangle(m_rect);
break;
case SOLIDRECTANGLE:
pOldPen=(CPen*)pDC->SelectStockObject(NULL_PEN);
pOldBrush=pDC->SelectObject(&brush);
pDC->Rectangle(m_rect);
break;
case RECTANGLE:
pOldPen=pDC->SelectObject(&pen);
pOldBrush=(CBrush*)pDC->SelectStockObject(NULL_BRUSH);
pDC->Rectangle(m_rect);
break;
case BLANKROUNDRECT:
pOldPen=pDC->SelectObject(&pen);
pOldBrush=pDC->SelectObject(&brush);
pDC->RoundRect(m_rect,point);
break;
case SOLIDROUNDRECT:
pOldPen=(CPen*)pDC->SelectStockObject(NULL_PEN);
pOldBrush=pDC->SelectObject(&brush);
pDC->RoundRect(m_rect,point);
break;
case ROUNDRECT:
pOldPen=pDC->SelectObject(&pen);
pOldBrush=(CBrush*)pDC->SelectStockObject(NULL_BRUSH);
pDC->RoundRect(m_rect,point);
break;
}
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}
void CRectangle::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{ // storing code
ar<>m_rect>>m_crPen>>m_crBrush>>m_width>>DrawShape;
}
}
bool CRectangle::HitTest(CPoint& pt,CDC* pDC)
{
m_rect.NormalizeRect ();
bool rel=false;
switch(DrawShape)
{
case BLANKRECTANGLE:case SOLIDRECTANGLE:case BLANKROUNDRECT:case SOLIDROUNDRECT:
rel=m_rect.PtInRect (pt);
break;
case RECTANGLE:case ROUNDRECT:
rel=IsOnRect(m_rect,pt);
break;
}
return rel;
}
CRect CRectangle:: GetOutside(CDC* pDC)
{
CRect rect=m_rect;
rect.InflateRect (5,5);
return rect;
}
void CRectangle::Offset(CSize& s)
{
m_rect.OffsetRect (s);
}
IMPLEMENT_SERIAL(CEllipse, CObject, 0)
CEllipse::CEllipse()
{
}
CEllipse::~CEllipse()
{
}
CEllipse::CEllipse(CRect rect,COLORREF crPen,COLORREF crBrush,UINT width,int shape)
{
m_rect=rect;
m_crPen=crPen;
m_crBrush=crBrush;
m_width=width;
DrawShape=shape;
}
void CEllipse::Draw(CDC *pDC)
{
ASSERT(m_width>=1 && m_width<=10);
CPen* pOldPen;
CBrush* pOldBrush;
CPen pen(PS_SOLID,m_width,m_crPen);
CBrush brush(m_crBrush);
switch(DrawShape)
{
case BLANKELLIPSE:
pOldPen=pDC->SelectObject(&pen);
pOldBrush=pDC->SelectObject(&brush);
pDC->Ellipse (m_rect);
break;
case SOLIDELLIPSE:
pOldPen=(CPen*)pDC->SelectStockObject(NULL_PEN);
pOldBrush=pDC->SelectObject(&brush);
pDC->Ellipse (m_rect);
break;
case ELLIPSE:
pOldPen=pDC->SelectObject(&pen);
pOldBrush=(CBrush*)pDC->SelectStockObject(NULL_BRUSH);
pDC->Ellipse (m_rect);
break;
}
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}
void CEllipse::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{ // storing code
ar<>m_rect>>m_crPen>>m_crBrush>>m_width>>DrawShape;
}
}
bool CEllipse::HitTest(CPoint& pt,CDC* pDC)
{
m_rect.NormalizeRect ();
bool rel=false;
switch(DrawShape)
{
case BLANKELLIPSE: case SOLIDELLIPSE:
rel=m_rect.PtInRect (pt);
break;
case ELLIPSE:
rel=IsOnRect(m_rect,pt);
break;
}
return rel;
}
CRect CEllipse:: GetOutside(CDC* pDC)
{
CRect rect=m_rect;
rect.InflateRect (5,5);
return rect;}
void CEllipse::Offset(CSize& s)
{
m_rect.OffsetRect (s);
}
// CDraw
CDraw::CDraw()
{
}
CDraw::~CDraw()
{
}
bool CDraw::IsOnline(CPoint& pFrom,CPoint& pTo,CPoint& pTest)
{
bool rel=false;
double a,b,c;
a=sqrt((double)(pTest.x-pFrom.x)*(pTest.x-pFrom.x)+(pTest.y-pFrom.y)*(pTest.y-pFrom.y));
b=sqrt((double)(pTest.x-pTo.x)*(pTest.x-pTo.x)+(pTest.y-pTo.y)*(pTest.y-pTo.y));
c=sqrt((double)(pFrom.x-pTo.x)*(pFrom.x-pTo.x)+(pFrom.y-pTo.y)*(pFrom.y-pTo.y));
rel=abs(a+b-c)<=5;
return rel;
}
bool CDraw::IsOnRect(CRect& rect,CPoint& pTest)
{
bool rel=false;
CPoint top_left,top_right,bottom_right,bottom_left;
top_left=rect.TopLeft ();
bottom_right=rect.BottomRight ();
top_right.x=rect.right ;
top_right.y=rect.top ;
bottom_left.x=rect.left;
bottom_left.y=rect.bottom ;
if(rel=IsOnline(top_left,top_right,pTest)) return rel;
if(rel=IsOnline(top_right,bottom_right,pTest)) return rel;
if(rel=IsOnline(bottom_left,bottom_right,pTest)) return rel;
if(rel=IsOnline(top_left,bottom_left,pTest)) return rel;
return rel;
}
// CDraw ³ÉÔ±º¯Êý