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.

247 lines
6.1 KiB
C++

1 month ago
#include "stdafx.h"
#include "HSimpleTracker.h"
#include "SigmaDoc.h"
#include "ScaleMotionGraphDrawer.h"
#include "PanMotionGraphDrawer.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]
CHSimpleTracker::CHSimpleTracker()
:m_status(HTRACKER_STATUS_HIDE),
m_pDoc(NULL),
m_motionCount(0),
m_transformKind(HTRACKER_TRANSFORM_KIND_SCALE)
{
m_pScaleMotionGraphDrawer = new ScaleMotionGraphDrawer();
m_pPanMotionGraphDrawer = new PanMotionGraphDrawer();
m_pTMGDrawer = m_pScaleMotionGraphDrawer;
}
CHSimpleTracker::~CHSimpleTracker()
{
delete m_pScaleMotionGraphDrawer;
m_pScaleMotionGraphDrawer = NULL;
delete m_pPanMotionGraphDrawer;
m_pPanMotionGraphDrawer = NULL;
}
bool CHSimpleTracker::Create(CSigmaDoc * pDoc, CRect boundRect)
{
if (boundRect.IsRectEmpty())
return false;
m_boundRect = boundRect;
//m_boundRect.SetRectEmpty();
m_pDoc = pDoc;
m_motionCount = 0;
m_drawer.Reset();
m_transformKind = HTRACKER_TRANSFORM_KIND_SCALE;
m_pTMGDrawer = m_pScaleMotionGraphDrawer;
m_pTMGDrawer->CopyMatrix(m_trackerTransform.GetMatrix());
m_handleCalctor.Calculate(m_boundRect);
return true;
}
void CHSimpleTracker::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);
//<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 CHSimpleTracker::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_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;
}
Draw(pDC);
//m_pTMGDrawer->FirstDraw(pDC, m_trackerTransform.GetMatrix(), mouseX, mouseY);
//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 CHSimpleTracker::LButtonUp(int mouseX, int mouseY, CDC * pDC)
{
//<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_transformKind = JudgeTransformKind(handleKind);
}
ChangeGraphDrawer();
ChangeHtrackerDrawerState();
//***<2A><><EFBFBD><EFBFBD>tracker<65>ķ<EFBFBD>Χ
//m_bound.CreateBoundRect(m_pDoc, m_selectionSet, m_boundRect);
TranslateBoundRect(m_boundRect);
m_trackerTransform.EndDrag();
if (m_motionCount != 0)
{
m_pTMGDrawer->Erease(pDC); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƥ<EFBFBD><C6A4>
m_drawer.Draw(pDC, m_boundRect); //<2F>ٻ<EFBFBD><D9BB><EFBFBD>Tracker
m_handleCalctor.Calculate(m_boundRect);
}
m_status = HTRACKER_STATUS_NOT_DRAG;
m_motionCount = 0;
}
void CHSimpleTracker::Draw(CDC * pDC)
{
if (m_boundRect.IsRectEmpty())
return;
CRect boundRect;
TranslateBoundRect(boundRect);
m_drawer.Draw(pDC, boundRect);
m_handleCalctor.Calculate(boundRect);
}
void CHSimpleTracker::Reset()
{
m_status = HTRACKER_STATUS_HIDE;
m_boundRect.SetRectEmpty();
m_handleCalctor.Reset();
m_trackerTransform.EndDrag();
m_motionCount = 0;
}
HTRACKER_HANDLE_KIND CHSimpleTracker::HitTest(int mouseX, int mouseY)
{
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);
}
CRect CHSimpleTracker::GetBoundRect()
{
return m_boundRect;
}
void CHSimpleTracker::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 CHSimpleTracker::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;
return HTRACKER_TRANSFORM_KIND_SCALE;
}
void CHSimpleTracker::ChangeGraphDrawer()
{
switch (m_transformKind)
{
case HTRACKER_TRANSFORM_KIND_SCALE:
m_pTMGDrawer = m_pScaleMotionGraphDrawer;
break;
case HTRACKER_TRANSFORM_KIND_MOVE:
m_pTMGDrawer = m_pPanMotionGraphDrawer;
break;
default:
m_pTMGDrawer = m_pScaleMotionGraphDrawer;
}
m_pTMGDrawer->CopyMatrix(m_trackerTransform.GetMatrix());
m_pTMGDrawer->SetBoundRect(m_boundRect);
}
//TODO:ֱ<><D6B1>ʹ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><><C9BE><EFBFBD>˺<EFBFBD><CBBA><EFBFBD>.
void CHSimpleTracker::ChangeHtrackerDrawerState()
{
m_drawer.SetRotateAndShearState(false);
}