📄 stmcrosseventhandle.cpp
字号:
// STMCrossEventHandle.cpp: implementation of the CSTMCrossEventHandle class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "stmeditor.h"
#include "STMCrossEventHandle.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#include "CrossNameInputDlg.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSTMCrossEventHandle::CSTMCrossEventHandle()
{
m_pDoc=NULL;
m_pMapView=NULL;
}
CSTMCrossEventHandle::~CSTMCrossEventHandle()
{
}
void CSTMCrossEventHandle::OnLButtonUp(UINT nFlags, CPoint point)
{
POINT originpoint;
originpoint=m_pMapView->GetScrollPosition();
point.Offset(originpoint);
if(m_pDoc->m_focusEI.eleType==ET_NULL)//destinate focus type
{
if(m_pDoc->m_activeType==ACT_CROSS_PICK)
{
CROSSINFO ci;
ci.pos=point;
strcpy(ci.name,"");
int index=m_pDoc->AddCross(ci);
DrawCross(index);
}else if(m_pDoc->m_activeType==ACT_CROSS_MOVE_CANCELED)
{
m_pDoc->m_activeType=ACT_CROSS_PICK;
}
}else if(m_pDoc->m_focusEI.eleType==ET_CROSS &&
m_pDoc->m_focusEI.index!=-1) //self type
{
if(m_pDoc->m_activeType==ACT_CROSS_PICK)
{
if(m_pDoc->m_focusEI.eleType==ET_CROSS)//rename the cross name
{
CROSSINFO ci=m_pDoc->m_arrCross.GetAt(m_pDoc->m_focusEI.index);
CCrossNameInputDlg inputdlg;
if(inputdlg.DoModal()==IDOK)
{
strcpy(ci.name,inputdlg.m_CrossName);
m_pDoc->m_arrCross.SetAt(m_pDoc->m_focusEI.index,ci);
}
}
}else if(m_pDoc->m_activeType==ACT_CROSS_MOVE)
{
CRgn oldeffectrgn,effectrgn;
m_pDoc->GetCrossEffectRgn(oldeffectrgn,m_tmpCrossIndex);
ELEINFO ei=m_pDoc->m_arrSel.GetAt(0);
POINT newCrossPos=m_pDoc->m_arrCross.GetAt(ei.index).pos;
m_pDoc->MoveCross(m_tmpCrossIndex,newCrossPos);
m_pDoc->m_arrCross.RemoveAt(ei.index);
ei.index=m_tmpCrossIndex;
m_pDoc->SelectElements(&ei,1);
m_pDoc->GetCrossEffectRgn(effectrgn,m_tmpCrossIndex);
effectrgn.CombineRgn(&effectrgn,&oldeffectrgn,RGN_OR);
effectrgn.OffsetRgn(-originpoint.x,-originpoint.y);
m_pMapView->InvalidateRgn(&effectrgn,FALSE);
m_pDoc->m_activeType=ACT_CROSS_PICK;
}else if(m_pDoc->m_activeType==ACT_BROWSE)
{
CString msg;
CROSSINFO ci=m_pDoc->m_arrCross.GetAt(m_pDoc->m_focusEI.index);
msg.Format("you clicked a cross! name=%s;position:x=%d;y=%d",ci.name,ci.pos.x,ci.pos.y);
}
}else if(m_pDoc->m_focusEI.eleType==ET_PATH &&
m_pDoc->m_focusEI.index!=-1)//break the dest path,it's important for a program to give a extent posibility
{
if(m_pDoc->m_activeType==ACT_CROSS_PICK)
{
CROSSINFO ci;
ci.pos=point;
ci.name[0]=0;
m_pDoc->AddCrossToPath(m_pDoc->m_focusEI.index,ci);
}
}
}
void CSTMCrossEventHandle::OnRButtonUp(UINT nFlags, CPoint point)
{
POINT originpoint;
originpoint=m_pMapView->GetScrollPosition();
point.Offset(originpoint);
if(m_pDoc->m_focusEI.eleType==ET_CROSS &&
m_pDoc->m_focusEI.index !=-1)
{
if(m_pDoc->m_activeType!=ACT_CROSS_MOVE) //delete cross
{
CRgn effectrgn;
m_pDoc->RemoveCross(effectrgn,m_pDoc->m_focusEI.index);
effectrgn.OffsetRgn(-originpoint.x,-originpoint.y);
m_pDoc->m_focusEI.index=-1;
m_pMapView->InvalidateRgn(&effectrgn,FALSE);
}else//cancel cross move
{
ELEINFO ei=m_pDoc->m_arrSel.GetAt(0);
CRgn crossrgn;
m_pDoc->RemoveCross(crossrgn,ei.index);
m_pMapView->InvalidateRgn(&crossrgn,FALSE);
ei.index=m_tmpCrossIndex;
m_pDoc->SelectElements(&ei,1);
DrawCross(ei.index);
m_pDoc->m_activeType=ACT_CROSS_MOVE_CANCELED;
}
}
}
void CSTMCrossEventHandle::OnMouseMove(UINT nFlags, CPoint point)
{
POINT originpoint;
originpoint=m_pMapView->GetScrollPosition();
point.Offset(originpoint);
if(!(nFlags&MK_LBUTTON))
{
if(m_pDoc->m_bFocusChanged)
{
if(m_pDoc->m_preFocusEI.eleType==ET_CROSS &&
m_pDoc->m_preFocusEI.index!=-1)// restore old focus
{
DrawCross(m_pDoc->m_preFocusEI.index);
}
if(m_pDoc->m_focusEI.eleType==ET_CROSS &&
m_pDoc->m_focusEI.index!=-1) //hilight the focus cross
{
DrawCross(m_pDoc->m_focusEI.index);
}
}
}else //drag
{
if(CanCrossMove())//move cross
{
if(m_pDoc->m_activeType==ACT_CROSS_PICK)
{
ELEINFO ei=m_pDoc->m_arrSel.GetAt(0);
m_tmpCrossIndex=ei.index;
CROSSINFO ci=m_pDoc->m_arrCross.GetAt(ei.index);
ci.pos=point;
m_pDoc->AddCross(ci);//add a temp cross
m_pDoc->m_activeType=ACT_CROSS_MOVE;
}else if(m_pDoc->m_activeType==ACT_CROSS_MOVE)
{
ELEINFO ei=m_pDoc->m_arrSel.GetAt(0);
CROSSINFO tmpCI=m_pDoc->m_arrCross.GetAt(ei.index);
CRect rc=m_pDoc->CalcCrossRect(tmpCI.pos);
tmpCI.pos=point;
m_pDoc->m_arrCross.SetAt(ei.index,tmpCI);//change temp cross pos
rc.OffsetRect(-originpoint.x,-originpoint.y);
m_pMapView->InvalidateRect(&rc,FALSE);
DrawCross(ei.index);
}
}
}
}
void CSTMCrossEventHandle::DrawCross(int index)
{
POINT pt=m_pDoc->m_arrCross.GetAt(index).pos;
ELEINFO ei;
ei.eleType=ET_CROSS;
ei.index=index;
ELESTATE state=m_pDoc->GetElementState(ei);//get element state
COLORREF color;
switch(state)
{
case ES_NORMAL:color=RGB(255,0,255);break;
case ES_FOCUS:color=RGB(255,255,0);break;
case ES_SELECTED:color=RGB(255,0,0);break;
}
POINT originpoint;
originpoint=m_pMapView->GetScrollPosition();
pt.x-=originpoint.x;
pt.y-=originpoint.y;
RECT rc=m_pDoc->CalcCrossRect(pt);
CDC *pDC=m_pMapView->GetDC();
pDC->FillSolidRect(&rc,color);
m_pMapView->ReleaseDC(pDC);
}
void CSTMCrossEventHandle::DrawAllCrosses()
{
for(int i=0;i<m_pDoc->m_arrCross.GetSize();i++)
{
DrawCross(i);
}
}
void CSTMCrossEventHandle::OnLButtonDown(UINT nFlags, CPoint point)
{
//draw new selected cross
if(m_pDoc->m_focusEI.eleType==ET_CROSS &&
m_pDoc->m_focusEI.index!=-1)
{
ELEINFO ei=m_pDoc->m_focusEI;
m_pDoc->SelectElements(&ei,1);
DrawCross(ei.index);
}
}
BOOL CSTMCrossEventHandle::CanCrossMove()
{
BOOL ret=TRUE;
if(m_pDoc->m_arrSel.GetSize()!=1)
ret=FALSE;
else
{
ELEINFO ei=m_pDoc->m_arrSel.GetAt(0);
if(ei.eleType!=ET_CROSS||ei.index==-1)
ret=FALSE;
}
return ret;
}
void CSTMCrossEventHandle::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -