#include "stdafx.h" #include "SelectionDrawer.h" #include "SigmaDoc.h" SelectionDrawer::SelectionDrawer(CSigmaDoc * pDoc) :m_pDoc(pDoc) { m_pDoc = nullptr; m_pSelection = nullptr; } void SelectionDrawer::OnDraw(CDC* pDC) { //m_selection = &m_oldSelection; //ReloadTrackerPath(); //m_Tracker.Draw(pDC); ReloadTrackerPath(); m_Tracker.Draw(pDC); } void SelectionDrawer::SetPostion(POSITION pos) { m_selection.RemoveAll(); m_selection.AddTail(pos); } void SelectionDrawer::ReloadTrackerPath(void) { //CWaitCursor wc; m_Tracker.Clear(); if (m_selection.IsEmpty()) return; POSITION pos, pt; pos = m_selection.GetHeadPosition(); while (pos != NULL) { pt = m_selection.GetNext(pos); LoadPath(pt); } } void SelectionDrawer::LoadPath(POSITION pos) { if (pos == NULL) return; COne* pOne; pOne = (COne*)m_pDoc->GetDraw()->GetAt(pos); LoadPath(pOne); } void SelectionDrawer::LoadPath(COne* pOne) { if (pOne == NULL) return; GraphicsPath path; path.Reset(); switch (pOne->GetType()) { case DOUBLEFOX_CURVE: LoadCurvePath(path, (CCurveEx*)pOne->GetValue()); break; case DOUBLEFOX_CIRCLE: case DOUBLEFOX_ELLIPSE: { CEllipse* pCircle = (CEllipse*)pOne->GetValue(); CRect8 range = pOne->GetRect(); CRect rt = (&m_pDoc->GetDC())->GetScreen(range); rt.NormalizeRect(); path.AddEllipse(rt.left, rt.top, rt.Width(), rt.Height()); } break; case DOUBLEFOX_FRAME: { m_posRect = pOne->GetRect(); m_posRect.NormalizeRect(); LoadRectPath(path, m_posRect); } break; case DOUBLEFOX_ARC: LoadCurvePath(path, ((CArc*)pOne->GetValue())->GetCurve()); break; case DOUBLEFOX_TEXT: { CText* pText = (CText*)pOne->GetValue(); CXyDC* pXyDC = &m_pDoc->GetDC(); CDC* pBakDC = pXyDC->GetDC(); CRect BakRT = pXyDC->GetViewRect(); CMemoryDC *pImageDC = new CMemoryDC; CSize sizeOld; sizeOld.cx = BakRT.Width(); sizeOld.cy = BakRT.Height(); if (!pImageDC->Create(sizeOld)) { delete pImageDC; pImageDC = nullptr; return; } pXyDC->Create(pImageDC); // »ñµÃ·¶Î§ CPoint point; point.x = pXyDC->GetSX(pText->x0); point.y = pXyDC->GetSY(pText->y0); CRect rect(point, point); CFont font; font.CreateFontIndirect(&pText->m_logFont); pImageDC->SelectObject(&font); pImageDC->DrawText(pText->GetName(), rect, DT_CALCRECT); pXyDC->Create(pBakDC); delete pImageDC; pImageDC = nullptr; CRect8 rt8 = pXyDC->GetReal(rect); rt8.NormalizeRect(); pText->Aligns(rt8); m_posRect = pOne->GetRect(); TRACE("Old_m_posRect:%lf,%lf,%lf,%lf,%lf,%lf\r\n" , m_posRect.left, m_posRect.top, m_posRect.right, m_posRect.bottom, m_posRect.Width(), m_posRect.Height()); m_posRect.SetRect(rt8.left, rt8.top, rt8.right, rt8.bottom); TRACE("New_m_posRect:%lf,%lf,%lf,%lf%lf,%lf\r\n" , m_posRect.left, m_posRect.top, m_posRect.right, m_posRect.bottom, m_posRect.Width(), m_posRect.Height()); LoadRectPath(path, m_posRect); } break; case DOUBLEFOX_XYZ: case DOUBLEFOX_POINT: //if (m_bPointTextSelected) //{ // CPointNameEx* ppn = (CPointNameEx*)pOne->GetValue(); // CRect8 range(1e100, -1e100, -1e100, 1e100); // ppn->GetRangeText(range, pOne->GetHowToViewPoint()); // LoadRectPath(path, range); //} //else //{ m_posRect = pOne->GetRect(); LoadRectPath(path, m_posRect); //} break; default: m_posRect = pOne->GetRect(); LoadRectPath(path, m_posRect); break; } // GetDoc()->GetTracker().AddPath(path); m_Tracker.AddPath(path, TRUE); } void SelectionDrawer::LoadCurvePath(GraphicsPath& path, CCurveEx* pc) { if (pc == NULL) return; Point *pt = new Point[pc->num]; CPoint point; for (int i = 0; i < pc->num; i++) { point = m_pDoc->GetDC().GetScreen(pc->x[i], pc->y[i]); pt[i].X = point.x; pt[i].Y = point.y; } path.AddCurve(pt, pc->num, 0); //path.CloseFigure(); delete[] pt; } void SelectionDrawer::LoadRectPath(GraphicsPath& path, CRect8 rect) { CCurveEx* pCurve = new CCurveEx(5); pCurve->CreateCurveFromRect(&rect); LoadCurvePath(path, pCurve); delete pCurve; }