📄 dynamic.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 + -