|
|
#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);
|
|
|
}
|
|
|
*/
|