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.

315 lines
8.0 KiB
C++

1 month ago
#include "stdafx.h"
#include "HTracker.h"
#include "SigmaDoc.h"
#include "ScaleMotionGraphDrawer.h"
#include "PanMotionGraphDrawer.h"
#include "RotationMotionGraphDrawer.h"
#include "ShearMotionGraphDrawer.h"
#include "SelectedItemMotionGraphDrawer.h"
bool GraphItemTransform(Gdiplus::Matrix * pMat, CPositionList & selectionSet, CSigmaDoc * pDoc);
//Tracker<65><72>״̬
//δ<><CEB4>ק״̬
//<2F><>ק״̬
//δ<><CEB4>ק״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<3A>û<EFBFBD><C3BB><EFBFBD>ѡ<EFBFBD><D1A1>ͼԪ
//<2F><>ק״̬:
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ק״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>]<5D><>[ѡ<>񼯲<EFBFBD><F1BCAFB2><EFBFBD>]<5D><>[<5B><><EFBFBD><EFBFBD>Handle]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ:[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>]<5D><>[<5B><><EFBFBD><EFBFBD>Handle]
//<2F>˳<EFBFBD><CBB3><EFBFBD>ק״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿ<EFBFBD>]/[<5B><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>]<5D><><><CEB4><EFBFBD><EFBFBD>Handle]
//<2F><><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>°<EFBFBD><C2B0><EFBFBD>̧<EFBFBD><CCA7>]<5D><><><CEB4><EFBFBD><EFBFBD>Handle]
HTracker::HTracker()
:m_status(HTRACKER_STATUS_HIDE),
m_HandleSize(12),
m_pDoc(NULL),
m_motionCount(0),
m_transformKind(HTRACKER_TRANSFORM_KIND_SCALE)
{
m_pScaleMotionGraphDrawer = new ScaleMotionGraphDrawer();
m_pPanMotionGraphDrawer = new PanMotionGraphDrawer();
m_pRotationMotionGraphDrawer = new RotationMotionGraphDrawer() ;
m_pShearMotionGraphDrawer = new ShearMotionGraphDrawer();
m_pTMGDrawer = m_pScaleMotionGraphDrawer;
m_pSIMGDrawer = new SelectedItemMotionGraphDrawer();
}
HTracker::~HTracker()
{
delete m_pSIMGDrawer;
m_pSIMGDrawer = NULL;
delete m_pScaleMotionGraphDrawer;
m_pScaleMotionGraphDrawer = NULL;
delete m_pPanMotionGraphDrawer;
m_pPanMotionGraphDrawer = NULL;
delete m_pRotationMotionGraphDrawer;
m_pRotationMotionGraphDrawer = NULL;
delete m_pShearMotionGraphDrawer;
m_pShearMotionGraphDrawer = NULL;
}
bool HTracker::Create(CSigmaDoc * pDoc, CPositionList & selectionSet)
{
if (selectionSet.IsEmpty() || pDoc == NULL)
return false;
m_boundRect.SetRectEmpty();
m_pDoc = pDoc;
m_motionCount = 0;
m_switch.Reset();
m_drawer.Reset();
m_transformKind = HTRACKER_TRANSFORM_KIND_SCALE;
CopySelectionSet(selectionSet);
m_pSIMGDrawer->Init(pDoc, &selectionSet);
m_pTMGDrawer = m_pScaleMotionGraphDrawer;
m_pTMGDrawer->SetSIMGDrawer(m_pSIMGDrawer);
m_pTMGDrawer->CopyMatrix(m_trackerTransform.GetMatrix());
if (m_bound.CreateBoundRect(pDoc, selectionSet, m_boundRect) == false)
return false;
m_handleCalctor.Calculate(m_boundRect);
return true;
}
void HTracker::LButtonDown(int mouseX, int mouseY)
{
HTRACKER_HANDLE_KIND handleKind = HitTest(mouseX, mouseY);
m_motionCount = 0;
if (handleKind == HTRACKER_HANDLE_KIND_INVALID)
{
m_status = HTRACKER_STATUS_HIDE;
return;
}
m_pTMGDrawer->LButtonDown(mouseX, mouseY);
m_switch.HitHandle();
//<2F><><EFBFBD><EFBFBD>Handle,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ק״̬
m_status = HTRACKER_STATUS_DRAGING;
CPoint mousePt(mouseX, mouseY);
m_trackerTransform.Init((int)handleKind, m_boundRect, mousePt); //<2F><><EFBFBD>Ż<EFBFBD>ƽ<EFBFBD>Ʊ任
m_transformKind = JudgeTransformKind(handleKind);
ChangeGraphDrawer();
ChangeHtrackerDrawerState();
}
void HTracker::MouseMove(CDC * pDC, int mouseX, int mouseY)
{
if (m_status == HTRACKER_STATUS_HIDE)
return;
if (m_status == HTRACKER_STATUS_NOT_DRAG)
return;
CPoint mousePt(mouseX, mouseY);
m_switch.MouseMove();
m_trackerTransform.SetKind(this->m_transformKind);
m_trackerTransform.Draging(mousePt);
//֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ק״̬
//<2F>ж<EFBFBD><D0B6>˳<EFBFBD><CBB3><EFBFBD>ק״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>״̬
//2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B2BB>Handle<6C><65>
//һ<><D2BB><EFBFBD>жϳ<D0B6><CFB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ק״̬<D7B4><CCAC><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD>ק״̬
HTRACKER_HANDLE_KIND handleKind = HitTest(mouseX, mouseY);
SHORT lbttonStatus = ::GetAsyncKeyState(VK_LBUTTON);
if (handleKind == HTRACKER_HANDLE_KIND_INVALID && lbttonStatus == 0)
{
m_status = HTRACKER_STATUS_NOT_DRAG; //<2F><><EFBFBD><EFBFBD>δ<EFBFBD><CEB4>ק״̬<D7B4><CCAC>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD>tracker.
GraphItemTransform(m_trackerTransform.GetMatrix(), m_selectionSet, m_pDoc);
m_trackerTransform.EndDrag();
return;
}
m_motionCount++;
if (m_motionCount == 1)
{
m_drawer.Draw(pDC, m_boundRect); //<2F><><EFBFBD><EFBFBD>tracker
m_pTMGDrawer->FirstDraw(pDC, m_trackerTransform.GetMatrix(), mouseX, mouseY);
}
else
m_pTMGDrawer->Draw(pDC, m_trackerTransform.GetMatrix(), mouseX, mouseY);
}
void HTracker::LButtonUp(int mouseX, int mouseY)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD>д<EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
//<2F><>Handle<6C><65><EFBFBD>Ȱ<EFBFBD><C8B0><EFBFBD><EFBFBD><EFBFBD>.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̧<EFBFBD><CCA7>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ƶ<EFBFBD>.
HTRACKER_HANDLE_KIND handleKind = HitTest(mouseX, mouseY);
if (m_motionCount == 0)
{
m_switch.ButtonUp(handleKind);
m_transformKind = JudgeTransformKind(handleKind);
}
ChangeGraphDrawer();
ChangeHtrackerDrawerState();
m_status = HTRACKER_STATUS_NOT_DRAG;
m_motionCount = 0;
GraphItemTransform(m_trackerTransform.GetMatrix(), m_selectionSet, m_pDoc);
m_pSIMGDrawer->Init(m_pDoc, &m_selectionSet);
m_bound.CreateBoundRect(m_pDoc, m_selectionSet, m_boundRect);
m_trackerTransform.EndDrag();
}
void HTracker::Draw(CDC * pDC)
{
if (m_boundRect.IsRectEmpty())
return;
CRect boundRect;
TranslateBoundRect(boundRect);
m_drawer.Draw(pDC, boundRect);
m_handleCalctor.Calculate(boundRect);
}
bool HTracker::IsDraging()
{
return m_status == HTRACKER_STATUS_DRAGING;
}
void HTracker::Reset()
{
m_status = HTRACKER_STATUS_HIDE;
m_selectionSet.RemoveAll();
m_boundRect.SetRectEmpty();
m_handleCalctor.Reset();
m_trackerTransform.EndDrag();
m_motionCount = 0;
m_switch.Reset();
}
HTRACKER_HANDLE_KIND HTracker::HitTest(int mouseX, int mouseY)
{
if (m_selectionSet.IsEmpty())
return HTRACKER_HANDLE_KIND_INVALID;
CPoint point(mouseX, mouseY);
int i = -1;
for (i = 0; i < 9; i++)
{
if (m_handleCalctor.GetHandleRect(i).PtInRect(point))
break;
}
if (i == -1)
return HTRACKER_HANDLE_KIND_INVALID;
//i<><69>ȡֵ<C8A1><D6B5>Χ:[0,8]
return HTRACKER_HANDLE_KIND(i);
}
bool HTracker::IsRotateAndShearState()
{
return m_switch.IsRotationAndShear();
}
void HTracker::CopySelectionSet(CPositionList & selectionSet)
{
m_selectionSet.RemoveAll();
m_selectionSet.AddTail(&selectionSet);
}
void HTracker::TranslateBoundRect(CRect & boundRectOut)
{
//<2F>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD>Ӧ<EFBFBD><D3A6>ϵ
// 0----------1
// | |
// | |
// 3----------2
Gdiplus::Point cornerPts[4];
cornerPts[0].X = cornerPts[3].X = m_boundRect.left;
cornerPts[0].Y = cornerPts[1].Y = m_boundRect.top;
cornerPts[1].X = cornerPts[2].X = m_boundRect.right;
cornerPts[2].Y = cornerPts[3].Y = m_boundRect.bottom;
Gdiplus::Matrix * matrix = m_trackerTransform.GetMatrix();
matrix->TransformPoints(cornerPts, 4);
boundRectOut.SetRect(cornerPts[0].X, cornerPts[0].Y, cornerPts[2].X, cornerPts[2].Y);
}
//ֻ<><D6BB><EFBFBD><EFBFBD>LButtonDown<77><6E>LButtonUp<55><70><EFBFBD><EFBFBD>Ч
HTRACKER_TRANSFORM_KIND HTracker::JudgeTransformKind(HTRACKER_HANDLE_KIND kind)
{
if (kind == HTRACKER_HANDLE_KIND_INVALID)
return HTRACKER_TRANSFORM_KIND_SCALE;
if (kind == HTRACKER_HANDLE_KIND_CENTER)
return HTRACKER_TRANSFORM_KIND_MOVE;
if (m_switch.IsRotationAndShear())
{
switch (kind)
{
case HTRACKER_HANDLE_KIND_TOP_LEFT:
case HTRACKER_HANDLE_KIND_TOP_RIGHT:
case HTRACKER_HANDLE_KIND_BOTTOM_RIGHT:
case HTRACKER_HANDLE_KIND_BOTTOM_LEFT:
return HTRACKER_TRANSFORM_KIND_ROTATION;
case HTRACKER_HANDLE_KIND_TOP:
case HTRACKER_HANDLE_KIND_RIGTH:
case HTRACKER_HANDLE_KIND_BOTTOM:
case HTRACKER_HANDLE_KIND_LEFT:
return HTRACKER_TRANSFORM_KIND_SHEAR;
}
return HTRACKER_TRANSFORM_KIND_SHEAR;
}
return HTRACKER_TRANSFORM_KIND_SCALE;
}
void HTracker::ChangeGraphDrawer()
{
switch (m_transformKind)
{
case HTRACKER_TRANSFORM_KIND_SCALE:
m_pTMGDrawer = m_pScaleMotionGraphDrawer;
break;
case HTRACKER_TRANSFORM_KIND_MOVE:
m_pTMGDrawer = m_pPanMotionGraphDrawer;
break;
case HTRACKER_TRANSFORM_KIND_ROTATION:
m_pTMGDrawer = m_pRotationMotionGraphDrawer;
break;
case HTRACKER_TRANSFORM_KIND_SHEAR:
m_pTMGDrawer = m_pShearMotionGraphDrawer;
break;
default:
m_pTMGDrawer = m_pScaleMotionGraphDrawer;
}
m_pTMGDrawer->SetSIMGDrawer(m_pSIMGDrawer);
m_pTMGDrawer->CopyMatrix(m_trackerTransform.GetMatrix());
m_pTMGDrawer->SetBoundRect(m_boundRect);
}
void HTracker::ChangeHtrackerDrawerState()
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>״̬<D7B4><CCAC><EFBFBD>򲻸ı<F2B2BBB8>drawer<65><72><EFBFBD><EFBFBD>ת״̬<D7B4><CCAC>
//<2F><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ת<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>ת״̬<D7B4>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>ͼԪ<CDBC><D4AA>
//<2F><>ô<EFBFBD><C3B4><EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bug:Trackerͼ<72><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD>д<EFBFBD>״̬<D7B4>У<EFBFBD>ִ<EFBFBD><D6B4>ƽ<EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD><EFBFBD><EFBFBD>
//֮<><D6AE><EFBFBD><EFBFBD>trackerͼ<72>α<EFBFBD><CEB1><EFBFBD>ƽ<EFBFBD><C6BD>ͼ<EFBFBD>Ρ<EFBFBD>
if (m_transformKind == HTRACKER_TRANSFORM_KIND_SCALE)
{
m_drawer.SetRotateAndShearState(false);
}
else if (m_transformKind == HTRACKER_TRANSFORM_KIND_ROTATION
|| m_transformKind == HTRACKER_TRANSFORM_KIND_SHEAR)
{
m_drawer.SetRotateAndShearState(true);
}
}