EasyRadar-类的多态
1.识别选择的雷达数据文件
打开一个雷达文件,判断雷达类型,选择相应的雷达类
(通过CSring 的 find() 函数)
void CEasyRadarDoc::OnFileOpen()
{
// TODO: 在此添加命令处理程序代码
CFileDialog dlg(true);
CString filename;
if(dlg.DoModal() == IDOK){
filename = dlg.GetFileName();//获得数据文件名
if(filename.Find(_T("SA")) != -1) m_Radar = &m_SAradar;//find函数未找到返回-1;类的多态
else if(filename.Find(_T("SC")) != -1) m_Radar = &m_SCradar;
else return;
if(!m_Radar->DecodeFile(dlg.GetPathName())) AfxMessageBox(_T("数据文件解码失败"));
else{
m_Radar->DrawVolPolar(0);//画图
m_fileflag = true;//数据flag
}
}
}
2.类的多态实现操作选择的雷达类
#include "Radar.h"
#include "SARadar.h"
#include "SCRadar.h"
-------------------
public:
CRadar *m_Radar;
CSARadar m_SAradar;
CSCRadar m_SCradar;
基类CRadar
#pragma once
class CRadar
{
public:
CRadar(void);
virtual ~CRadar(void);
public:
virtual int DecodeFile(CString filepath);
virtual int DrawVolPolar(int layer);//layer为层
};
子类CSCRadar
class CSCRadar :
public CRadar
{
public:
CSCRadar(void);
virtual ~CSCRadar(void);
public:
virtual int DecodeFile(CString filepath);//解码
virtual int DrawVolPolar(int layer);//layer为层
int PreDraw();//双缓存设置
private:
//雷达参数
FILEHEADRADARSC m_FileHeadSC;
DATARECORDSC m_DataSC;
float ***m_ref;//反射率
float *m_el;//仰角
float **m_az;//方位角
int *m_radialnum;//层径向数
int *m_binnum;//库数
int *m_binwidth;//库宽
float m_radLat;
float m_radLon;
float m_radHgt;
//画图参数
CDC *m_clientdc;
CDC *m_memDC;
CBitmap *m_memBmp;
CRect m_clientrect;
int m_predrawflag;//画图flag,0:未设置双缓存;1:已设置双缓存
};
子类CSARadar
class CSARadar :
public CRadar
{
public:
CSARadar(void);
~CSARadar(void);
public:
virtual int DecodeFile(CString filepath);//解码
virtual int DrawVolPolar(int layer);//layer为层
int PreDraw();//双缓存设置
private:
//雷达参数
SA_DATA_LEVEL2_RADIAL m_rfh;//径向结构体
float ***m_ref;//反射率
float *m_el;//仰角
float **m_az;//方位角
int *m_radialnum;//层径向数
int *m_binnum;//库数
int *m_binwidth;//库宽
//画图参数
CDC *m_clientdc;
CDC *m_memDC;
CBitmap *m_memBmp;
CRect m_clientrect;
int m_predrawflag;//画图flag,0:未设置双缓存;1:已设置双缓存
};