#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: // ÎÞÐë´¦Àí 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); } */