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

📄 dynamic.cpp

📁 Viaual C++实战演练一书的源代码,对于C++程序员有实际的借鉴意义.
💻 CPP
字号:
#include <StdAfx.h>

#include "Dynamic.h"
#include "Demo3Doc.h"


//********************************************
//**********  CDynaObjects类实现  ************
//********************************************

CDynaObjects::CDynaObjects(CDemo3Doc* pDoc)
{
	m_pDoc = pDoc;
	m_aShips.RemoveAll();
}

CDynaObjects::~CDynaObjects()
{
	m_pDoc->m_nCanDisplay = 0;//禁止所有动态目标显示
	InitData();
}

void CDynaObjects::InitData()
{
	int i;

	for(i=m_aShips.GetSize()-1; i>=0; i--)
	{
		if( !(m_aShips[i]->m_nCorp & m_pDoc->m_nCanDisplay) )
		{
			delete m_aShips[i];
			m_aShips.RemoveAt(i);
		}
	}
}

bool CDynaObjects::IsExistShip(char* bh)
{
	int i;

	for(i=m_aShips.GetSize()-1; i>=0; i--)
	{
		if( m_aShips[i]->m_strScutcheon == bh )
		{
			return true;
		}
	}
	return false;
}

void CDynaObjects::ReceiveHJ(TRACK0_10H* t)
{
	int i;

	//首先判断是否为已有航迹
	for(i=m_aShips.GetSize()-1; i>=0; i--)
	{
		if(m_aShips[i]->m_strScutcheon == t->bp)
		{
			*m_aShips[i] = t;
			return;
		}
	}

	//如果为新航迹且可显示,向数组中增加该航迹
	if(t->corp & m_pDoc->m_nCanDisplay)
	{
		CShip* ship = new CShip(m_pDoc);
		*ship = t;
		m_aShips.Add(ship);
	}
}

void CDynaObjects::ReceiveHJ1(TRACK1_11H* t)
{
	int i, j;

	for(i=m_aShips.GetSize()-1; i>=0; i--)
	{
		if(m_aShips[i]->m_strScutcheon == t->bp)
		{
			CShip* ship = m_aShips[i];
			switch(t->Act)
			{
			case 0://删除目标
				m_aShips.RemoveAt(i);
				delete ship;
				break;
			case 1://改变目标标牌
				if( !IsExistShip(t->bp1) )
				{//无重复航迹,可修改标牌
					ship->m_strScutcheon = t->bp1;
				}
				break;
			case 2://分批
				if( !IsExistShip(t->bp1) )
				{//复制目标
					CShip* s = new CShip(m_pDoc);
					*s = *ship;
					s->m_strScutcheon = t->bp1;
					m_aShips.Add(s);
				}
				break;
			case 3://和批
				if( j = FindShipPos(t->bp1) != -1 )
				{//删除 t->bp1 指定的目标
					CShip* s = m_aShips.GetAt(j);
					m_aShips.RemoveAt(j);
					delete s;
				}
				break;
			}
			break;//跳出for循环
		}
	}
}

void CDynaObjects::Draw(CDC* pDC)
{
	int i;

	for(i=m_aShips.GetSize()-1; i >=0; i--)
	{
		CShip* ship = m_aShips[i];
		if(ship->m_nCorp & m_pDoc->m_nCanDisplay)
		{
			m_aShips[i]->Draw(pDC);
		}
	}
}

CShip* CDynaObjects::PointAt(CPoint point)
{
	int i;

	for(i=m_aShips.GetSize()-1; i >=0; i--)
	{
		CShip* ship = m_aShips[i];
		if(ship->PointAt(point))
		{
			return ship;
		}
	}
	return NULL;
}

CShip* CDynaObjects::FindShip(char* bp)
{
	int i;

	for(i=m_aShips.GetSize()-1; i >=0; i--)
	{
		CShip* ship = m_aShips[i];
		if(ship->m_strScutcheon == bp)
		{
			return ship;
		}
	}
	return NULL;
}

int CDynaObjects::FindShipPos(char* bp)
{
	int i;

	for(i=m_aShips.GetSize()-1; i >=0; i--)
	{
		if( m_aShips[i]->m_strScutcheon == bp)
		{
			return i;
		}
	}
	return -1;
}

//********************************************
//*************  CShip类实现  ****************
//********************************************

CShip::CShip(CDemo3Doc* pDoc)
{
	m_fCourse = 0;
	m_fV = 0;
	m_fX0 = 0;
	m_fY0 = 0;
	m_nStyle = 0;
	m_pDoc = pDoc;
	//大目标轮廓数据
	m_nPoints0[0].x = 0, m_nPoints0[0].y = 0;
	m_nPoints0[1].x = -6, m_nPoints0[1].y = 10;
	m_nPoints0[2].x = -6, m_nPoints0[2].y = 26;
	m_nPoints0[3].x = 6, m_nPoints0[3].y = 26;
	m_nPoints0[4].x = 6, m_nPoints0[4].y = 10;
	m_nPoints0[5].x = 0, m_nPoints0[5].y = 0;
	//小目标轮廓数据
	m_nPoints1[0].x = 0, m_nPoints1[0].y = 0;
	m_nPoints1[1].x = -6, m_nPoints1[1].y = 26;
	m_nPoints1[2].x = 6, m_nPoints1[2].y = 26;
	m_nPoints1[3].x = 0, m_nPoints1[3].y = 0;
}
	
CShip& CShip::operator = (TRACK0_10H* t)
{
	m_fX0 = t->j;
	m_fY0 = t->w;
	m_fV = t->hs;
	m_fCourse = t->hx;
	m_strScutcheon = t->bp;
	m_nStyle = t->lx;
	m_tTime = t->t;
	m_nCorp = t->corp;

	return *this;
}

CShip& CShip::operator = (CShip& ship)
{
	m_fX0 = ship.m_fX0;
	m_fY0 = ship.m_fY0;
	m_fV = ship.m_fV;
	m_fCourse = ship.m_fCourse;
	m_strScutcheon = ship.m_strScutcheon;
	m_nStyle = ship.m_nStyle;
	m_tTime = ship.m_tTime;
	m_nCorp = ship.m_nCorp;

	return *this;
}

void CShip::Draw(CDC* pDC)
{
	int i, fontwidth = 6;
	CPen pen(PS_SOLID, 1, UD_RED), *oldpen;
	
	oldpen = pDC->SelectObject(&pen);//设置绘制笔颜色

	double CosA = cos(m_fCourse * 0.0174532925);
	double SinA = sin(m_fCourse * 0.0174532925);
	long x0, y0;
	long x1, y1;
	//计算图标的屏幕位置
	m_pDoc->ConvToXY(m_fX0, m_fY0, x0, y0);
	m_pDoc->LPtoDP(x0, y0);

	pDC->MoveTo(x0, y0);
	if(m_nStyle == 0)
	{//大目标
		for(i=1; i<6; i++)
		{
			x1 = x0 + m_nPoints0[i].x * CosA - m_nPoints0[i].y * SinA;
			y1 = y0 + m_nPoints0[i].y * CosA + m_nPoints0[i].x * SinA;
			pDC->LineTo(x1, y1);
		}
	}
	else if(m_nStyle == 1)
	{//小目标
		for(i=1; i<4; i++)
		{
			x1 = x0 + m_nPoints1[i].x * CosA - m_nPoints1[i].y * SinA;
			y1 = y0 + m_nPoints1[i].y * CosA + m_nPoints1[i].x * SinA;
			pDC->LineTo(x1, y1);
		}
	}
	else
	{//两种目标类型均不是,返回
		//恢复DC缺省值
		pDC->SelectObject(oldpen);
		//删除资源
		pen.DeleteObject();
		return;
	}

	CFont font, *oldfont;
	//创建字体资源
	x1 = m_fCourse * -10;//旋转角度
	font.CreateFont(fontwidth*-2, 0, x1, x1, FW_NORMAL, false, false, false,
		DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
		DEFAULT_QUALITY, DEFAULT_PITCH, "宋体");//创建字体

	oldfont = pDC->SelectObject(&font);
	int oldbkmode;
	oldbkmode = pDC->SetBkMode(TRANSPARENT);

	x1 = m_strScutcheon.GetLength() * -0.5 * fontwidth;
	y1 = y0 + 27 * CosA + x1 * SinA;
	x1 = x0 + x1 * CosA - 27 * SinA;

	pDC->TextOut(x1, y1, m_strScutcheon);

	//恢复DC缺省值
	pDC->SelectObject(oldpen);
	pDC->SelectObject(oldfont);
	pDC->SetBkMode(oldbkmode);
	//删除资源
	pen.DeleteObject();
	font.DeleteObject();
}

bool CShip::PointAt(CPoint point)
{
	CPoint data[6];
	double CosA = cos(m_fCourse * 0.0174532925);
	double SinA = sin(m_fCourse * 0.0174532925);
	long x0, y0;
	int i=0;
	//计算图标的屏幕位置
	m_pDoc->ConvToXY(m_fX0, m_fY0, x0, y0);
	m_pDoc->LPtoDP(x0, y0);

	if(m_nStyle == 0)
	{//大目标
		for(i=0; i<6; i++)
		{
			data[i].x = x0 + m_nPoints0[i].x * CosA - m_nPoints0[i].y * SinA;
			data[i].y = y0 + m_nPoints0[i].y * CosA + m_nPoints0[i].x * SinA;
		}
	}
	else if(m_nStyle == 1)
	{//小目标
		for(i=0; i<4; i++)
		{
			data[i].x = x0 + m_nPoints1[i].x * CosA - m_nPoints1[i].y * SinA;
			data[i].y = y0 + m_nPoints1[i].y * CosA + m_nPoints1[i].x * SinA;
		}
	}

	CRgn rgn;
	if(!rgn.CreatePolygonRgn(data, i, ALTERNATE))
	{//无法创建区域
		return false;
	}
	bool stat = rgn.PtInRegion(point);//判断点point是否在区域内
	rgn.DeleteObject();//删除区域资源
	return stat;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -