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.
171 lines
3.9 KiB
C++
171 lines
3.9 KiB
C++
#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;
|
|
} |