⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stmcrosseventhandle.cpp

📁 电子交通地图
💻 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 + -