You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

299 lines
6.6 KiB
C++

#include "StdAfx.h"
#include "itemarc.h"
CItemArc::CItemArc(CSigmaDoc * ppDoc)
: CItem(ppDoc)
, m_state(CArc::drawArc)
, m_bDoSelectEnd(TRUE)
, m_bDrawCtrl(FALSE)
, m_nDrawType(0)
, m_bFirst(true)
{
this->SetType(ITEM_ARC);
loop=0;
EnableRButtonCancel(TRUE);
}
CItemArc::~CItemArc(void)
{
}
void CItemArc::OnLButtonDown(CDC* pDC, UINT nFlags, CPoint point, int vk)
{
SetScreenDC(pDC);
GetDC()->Create(pDC);
CPoint2D dp=GetDC()->GetReal(point);
m_bFirst = true;
switch(loop)
{
case 0:
PointStart=dp;
PointMiddle=PointStart;
break;
case 1:
//DrawLineReal(PointStart.x0, PointStart.y0, PointMiddle.x0, PointMiddle.y0);
PointMiddle=dp;
PointEnd=PointMiddle;
RectArc.Empty();
{
double r;
if(!AfxGetPublicFunction()->GetCircumcenter(dp.x0,dp.y0,r,PointStart.x0,PointStart.y0,PointMiddle.x0,PointMiddle.y0,PointEnd.x0,PointEnd.y0) )
break;
RectArc.SetRect(dp.x0-r,dp.y0-r,dp.x0+r,dp.y0+r);
Draw(RectArc,PointStart,PointEnd);
}
break;
case 2:
{
Draw(RectArc,PointStart,PointEnd);
PointEnd=dp;
//if(m_bDoSelectEnd)
DoSelectEnd();
Draw(RectArc, PointStart, PointEnd);
}
loop=-1;
break;
}
loop++;
}
int CItemArc::OnMouseMove(CDC* pDC, UINT nFlags, CPoint point)
{
SetScreenDC(pDC);
GetDC()->Create(pDC);
CPoint2D dp=GetDC()->GetReal(point);
switch(loop)
{
case 1:
DrawLineReal(PointStart.x0,PointStart.y0,PointMiddle.x0,PointMiddle.y0);
PointMiddle=dp;
DrawLineReal(PointStart.x0,PointStart.y0,PointMiddle.x0,PointMiddle.y0);
break;
case 2:
{
double r;
CPoint2D cp;
if(!AfxGetPublicFunction()->GetCircumcenter(cp.x0,cp.y0,r,PointStart.x0,PointStart.y0,PointMiddle.x0,PointMiddle.y0,PointEnd.x0,PointEnd.y0) )
break;
//if (!m_bFirst)
if(!RectArc.IsEmpty())
Draw(RectArc,PointStart, PointEnd);
m_bFirst = false;
RectArc.SetRect(cp.x0-r,cp.y0-r,cp.x0+r,cp.y0+r);
PointEnd=dp;
Draw(RectArc,PointStart,PointEnd);
}
break;
}
return 1;
}
void CItemArc::Draw(CRect8 rect, CPoint2D ptStart, CPoint2D ptEnd)
{
CRect rt=GetDC()->GetScreen(rect);
CPoint ps=GetDC()->GetScreen(ptStart.x0,ptStart.y0);
CPoint pe=GetDC()->GetScreen(ptEnd.x0,ptEnd.y0);
CDC* pDCMem = GetDC()->GetDC();
int od= pDCMem->SetROP2(R2_NOTXORPEN);
//BOOL bCtrl = ::IsKeyDown(VK_CONTROL);
if (m_bDrawCtrl)
{
switch (m_state)
{
case CArc::drawArc:
pDCMem->Arc(&rt, pe, ps);
break;
case CArc::drawPie:
pDCMem->Pie(&rt, pe, ps);
break;
case CArc::drawChord:
pDCMem->Chord(&rt, pe, ps);
break;
}
}
else
{
switch (m_state)
{
case CArc::drawArc:
pDCMem->Arc(&rt, ps, pe);
break;
case CArc::drawPie:
pDCMem->Pie(&rt, ps, pe);
break;
case CArc::drawChord:
pDCMem->Chord(&rt, ps, pe);
break;
}
}
pDCMem->SetROP2(od);
}
BOOL CItemArc::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
switch(nChar)
{
case VK_CONTROL:
m_bDrawCtrl=TRUE;
//if(loop!=2) break;
//if(!RectArc.IsEmpty())
// Draw(RectArc,PointStart,PointEnd);
//Draw(RectArc,PointStart,PointEnd);
break;
default:
break;
}
return CItem::OnKeyDown(nChar, nRepCnt, nFlags);
}
BOOL CItemArc::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
switch(nChar)
{
case VK_CONTROL:
m_bDrawCtrl=FALSE;
//if(loop!=2) break;
//if(!RectArc.IsEmpty())
// Draw(RectArc,PointEnd, PointStart);
//Draw(RectArc,PointStart,PointEnd);
break;
case VK_ESCAPE:
// <20><><EFBFBD><EFBFBD><EBB4A6>
return TRUE;
default:
break;
}
return CItem::OnKeyUp(nChar, nRepCnt, nFlags);
}
BOOL CItemArc::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
return TRUE;
//GetDoc()->GetCursor().SetCursor(CursorRange);
//return GetDoc()->GetCursor().SetCursor();
}
void CItemArc::SetState(int state)
{
m_state=state;
}
CArc* CItemArc::CreateArc(void)
{
double r;
CPoint2D cp;
if(!AfxGetPublicFunction()->GetCircumcenter(cp.x0,cp.y0,r,PointStart.x0,PointStart.y0,PointMiddle.x0,PointMiddle.y0,PointEnd.x0,PointEnd.y0) )
return NULL;
CArc* pArc=new CArc();
pArc->SetType(m_state);
if(m_bDrawCtrl)
pArc->SetParameter(cp, PointEnd, PointStart);
else
pArc->SetParameter(cp, PointStart, PointEnd);
pArc->GetCurve(3.0);
return pArc;
}
BOOL CItemArc::DoSelectEnd(void)
{
CArc* pArc=CreateArc();
if(pArc==NULL) return FALSE;
POSITION pos=AddElement(pArc,DOUBLEFOX_ARC);
//GetDoc()->Select(pos);
return TRUE;
}
int CItemArc::GetState(void)
{
return m_state;
}
/*
BOOL CItemArc::InitPropertyGrid(CXTPPropertyGrid& grid)
{
if(!this->IsEditState()) return FALSE;
CPropertyGridItemAdd ItemAdd(NULL);
CXTPPropertyGridItem* pItem=grid.AddCategory(IDS_STRING_ARC); ItemAdd.SetItem(pItem); pItem->Expand();
CString strFormat=GetFloatFormatString();
CArc* pArc=(CArc*)GetDoc()->GetDraw()->GetAtValue(GetPos());
m_point.SetPoint(pArc->x0,pArc->y0);
ItemAdd.AddItemPoint(IDS_GI_CIRCLE_COOR, m_point, &m_point);
m_size = GetUnitMode().toPrintUnit(pArc->m_size);
ItemAdd.AddItemUnitSize8(IDS_GI_CIRCLE_RADIUS, GetUnit(), m_size, &m_size, IDS_GI_CIRCLE_WIDTH, IDS_GI_CIRCLE_HEIGHT);
ItemAdd.AddItemDouble(IDS_GI_ARC_BEGIN, pArc->arc1, strFormat, NULL);
ItemAdd.AddItemDouble(IDS_GI_ARC_END, pArc->arc2, strFormat, NULL);
switch(pArc->GetType())
{
case CArc::drawArc: m_nDrawType=0; break;
case CArc::drawChord: m_nDrawType=1; break;
case CArc::drawPie: m_nDrawType=2; break;
}
ItemAdd.AddItemCombo(IDS_STRING_TYPE, IDS_GI_ARC_TYPE, m_nDrawType, &m_nDrawType);
m_dCurveWidth = GetUnitMode().toPrintUnit(pArc->m_dCurveWidth);
ItemAdd.AddItemUnitDouble(IDS_STRING_CURVE_WIDTH, GetUnit(), m_dCurveWidth, strFormat, &m_dCurveWidth);
CItem::InitPropertyGrid(grid);
return TRUE;
}
BOOL CItemArc::OnGridItemChangeValue(CXTPPropertyGridItem* pItem)
{
if(!this->IsEditState()) return FALSE;
CArc* pArc=(CArc*)GetDoc()->GetDraw()->GetAtValue(GetPos());
BOOL bUpdate=FALSE;
switch(pItem->GetID())
{
case 0:
break;
case IDS_STRING_CURVE_WIDTH:
pArc->m_dCurveWidth = GetUnitMode().toRealUnit(m_dCurveWidth);
bUpdate=TRUE;
break;
case IDS_GI_CIRCLE_RADIUS:
pArc->m_size = GetUnitMode().toRealUnit(m_size);
bUpdate=TRUE;
break;
case IDS_GI_ARC_BEGIN:
pArc->arc1=((CXTPPropertyGridItemDouble*)pItem)->GetDouble();
bUpdate=TRUE;
break;
case IDS_GI_ARC_END:
pArc->arc2=((CXTPPropertyGridItemDouble*)pItem)->GetDouble();
bUpdate=TRUE;
break;
case IDS_STRING_TYPE:
switch(m_nDrawType)
{
case 0: pArc->SetType(CArc::drawArc); break;
case 1: pArc->SetType(CArc::drawChord); break;
case 2: pArc->SetType(CArc::drawPie); break;
}
bUpdate=TRUE;
break;
case IDS_GI_CIRCLE_COOR:
pArc->x0=m_point.x0;
pArc->y0=m_point.y0;
bUpdate=TRUE;
break;
}
if(bUpdate)
pArc->GetCurve(pArc->step);
return bUpdate | CItem::OnGridItemChangeValue(pItem);
}
*/