📄 mainfrm.cpp
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
#include "GpsNav.h"
#include "MainFrm.h"
#include "GpsNavView.h"
#include "DisplayView.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define PSPC_TOOLBAR_HEIGHT 24
const DWORD dwAdornmentFlags = 0; // exit button
int GetGpsQuality(const CString str);
double GetHDop(const CString str);
int GetSatNum(const CString str);
void Str2Str(const CString str,char *tostr);
bool CheckOut(const CString &str);
RESULT GetResult(const CString str);
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_MESSAGE(WM_COMM_RXCHAR, OnCommunication)
ON_COMMAND(ID_MENUEXIT, OnMenuexit)
ON_WM_CANCELMODE()
ON_CBN_SELCHANGE(IDC_COM, OnCom)
ON_COMMAND(ID_EXIT, OnExit)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
static UINT indicators[] =
{
//ID_SEPARATOR, // status line indicator
ID_COOR,
};
PARA pp={
6378137.0,
6378140. ,
298.257223563,
298.257,
};
/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
{
// TODO: add member initialization code here
m_nCurrentExample=1;
m_index=0;
m_strReceived="";
}
CMainFrame::~CMainFrame()
{
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
ModifyStyle(m_hWnd,WS_CAPTION,WS_MINIMIZEBOX,SWP_NOSIZE);
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
m_wndCommandBar.m_bShowSharedNewButton = FALSE;
m_ToolTipsTable[0] = MakeString(IDS_NEW);
m_ToolTipsTable[1] = MakeString(IDS_FILE);
m_ToolTipsTable[2] = MakeString(IDS_MHELP);
m_ToolTipsTable[3] = MakeString(IDS_CUT);
m_ToolTipsTable[4] = MakeString(IDS_COPY);
m_ToolTipsTable[5] = MakeString(IDS_PASTE);
m_ToolTipsTable[6] = MakeString(IDS_ABOUT);
if(!m_wndCommandBar.Create(this) ||
!m_wndCommandBar.InsertMenuBar(IDR_MAINFRAME) ||
!m_wndCommandBar.AddAdornments() ||
!m_wndCommandBar.LoadToolBar(IDR_MAINFRAME) ||
!m_wndCommandBar.SendMessage(TB_SETTOOLTIPS, (WPARAM)(6), (LPARAM)(&m_ToolTipsTable[1])))
{
TRACE0("Failed to create CommandBar\n");
return -1; // fail to create
}
m_Cmb=m_wndCommandBar.InsertComboBox(80,IDC_COM, CMDBAR_END,CBS_DROPDOWNLIST |WS_VSCROLL);
m_Cmb->SetOwner(this);
m_Cmb->AddString(_T("Setup"));
m_Cmb->AddString(_T("Display"));
m_Cmb->SetCurSel(0);
m_wndCommandBar.SetBarStyle(m_wndCommandBar.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_FIXED);
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
m_wndStatusBar.SetPaneText(0,_T("Not start navigation!"),TRUE);
return 0;
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
return TRUE;
}
LPTSTR CMainFrame::MakeString(UINT stringID)
{
TCHAR buffer[255];
TCHAR* theString;
::LoadString(AfxGetInstanceHandle(), stringID, buffer, 255);
theString = new TCHAR[lstrlen(buffer) + 1];
lstrcpy(theString, buffer);
return theString;
}
/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CFrameWnd::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
LONG CMainFrame::OnCommunication(WPARAM parach, LPARAM port)//UINT, LONG
{
CString ssss="";
if (port <= 0 || port > 4)
return -1;
POSITION po=AfxGetApp()->GetFirstDocTemplatePosition();
CDocTemplate *pDocTem=AfxGetApp()->GetNextDocTemplate(po);
po=pDocTem->GetFirstDocPosition();
CGpsNavDoc *pDoc=(CGpsNavDoc *)pDocTem->GetNextDoc(po);
DBLH dd;
int nQuality;
double HDop;
int nSats;
CString str="",str1="";
int i=0;
CWayPoint cp;
if(!CheckOut(m_strReceived))
{
return 0;
}
/////////////////////////////////////////////////////////////
pDoc->m_res=GetResult(m_strReceived);
int hh=(int)(pDoc->m_res.fTime/10000.);
int mm=(int)((pDoc->m_res.fTime-hh*10000)/100.);
float ss=pDoc->m_res.fTime-hh*10000-mm*100;
str.Format(_T("%2d:%2d:%5.2f"),hh,mm,ss);
dd.DB=((int)(pDoc->m_res.fLat/100.)+(pDoc->m_res.fLat-100*(int)(pDoc->m_res.fLat/100.))/60.)/P2;
dd.DL=((int)(pDoc->m_res.fLon/100.)+(pDoc->m_res.fLon-100*(int)(pDoc->m_res.fLon/100.))/60.)/P2;
dd.DH=pDoc->m_res.fAntenna;
nQuality=pDoc->m_res.nQuality;
HDop=pDoc->m_res.fHdop;
nSats=pDoc->m_res.nSates;
str1.Format(_T("*Sats:%2d"),nSats);
str+=str1;
switch(nQuality)
{
case 0:
str+="*Invalid";
break;
case 1:
str+="*GPS Fixed";
break;
case 2:
str+="*DGPS Fixed";
break;
}
str1.Format(_T("*HDop:%3.1lf"),HDop);
str+=str1;
cp.SetDblh(dd);
pDoc->m_Way.SetOldPoint(pDoc->m_Way.GetCurPoint());
pDoc->m_Way.SetCurPoint(cp);
//////////////////////////////////////////////////////////////
m_index=0;
m_strReceived="";
m_wndStatusBar.SetPaneText(0,LPCTSTR(str),TRUE);
pDoc->UpdateAllViews(NULL);
return 0;
}
void CMainFrame::ShowDisplayView(int b)
{
CView* pOldActiveView = GetActiveView();
::SetWindowLong(pOldActiveView->m_hWnd, GWL_ID, m_nCurrentExample);
CRuntimeClass* pNewViewClass;
switch (m_nCurrentExample)
{
case 0:
if(!b)
{
pNewViewClass = RUNTIME_CLASS(CGpsNavView);
m_Cmb->SetCurSel(0);
}
break;
case 1:
if(b)
{
pNewViewClass = RUNTIME_CLASS(CDisplayView);
m_Cmb->SetCurSel(1);
}
break;
default:
ASSERT(0);
return;
}
// create the new view
CCreateContext context;
context.m_pNewViewClass = pNewViewClass;
context.m_pCurrentDoc = GetActiveDocument();
CView* pNewView = STATIC_DOWNCAST(CView, CreateView(&context));
if (pNewView != NULL)
{
// the new view is there, but invisible and not active...
pNewView->ShowWindow(SW_SHOW);
pNewView->OnInitialUpdate();
SetActiveView(pNewView);
RecalcLayout();
m_nCurrentExample = !m_nCurrentExample;
// finally destroy the old view...
pOldActiveView->DestroyWindow();
}
}
bool CheckOut(const CString &str)
{
return true;//暂时没有实现
}
RESULT GetResult(const CString str)
{
RESULT re;
memset(&re,0,sizeof(RESULT));
char buf[1024];
char cLat,cLon;
CString s="";
int nStart,nEnd;
nStart=str.Find(',');
nEnd=str.Find(',',nStart+1);
s=str.Mid(nStart+1,nEnd-nStart-1);
Str2Str(s,buf);
sscanf(buf,"%f",&re.fTime);
nStart=nEnd;
nEnd=str.Find(',',nStart+1);
s=str.Mid(nStart+1,nEnd-nStart-1);
Str2Str(s,buf);
sscanf(buf,"%f",&re.fLat);
nStart=nEnd;
nEnd=str.Find(',',nStart+1);
s=str.Mid(nStart+1,nEnd-nStart-1);
Str2Str(s,buf);
sscanf(buf,"%c",&cLat);
if(cLat=='S')
re.fLat=-re.fLat;
nStart=nEnd;
nEnd=str.Find(',',nStart+1);
s=str.Mid(nStart+1,nEnd-nStart-1);
Str2Str(s,buf);
sscanf(buf,"%f",&re.fLon);
nStart=nEnd;
nEnd=str.Find(',',nStart+1);
s=str.Mid(nStart+1,nEnd-nStart-1);
Str2Str(s,buf);
sscanf(buf,"%c",&cLon);
if(cLon=='W')
re.fLon=-re.fLon;
nStart=nEnd;
nEnd=str.Find(',',nStart+1);
s=str.Mid(nStart+1,nEnd-nStart-1);
Str2Str(s,buf);
sscanf(buf,"%d",&re.nQuality);
nStart=nEnd;
nEnd=str.Find(',',nStart+1);
s=str.Mid(nStart+1,nEnd-nStart-1);
Str2Str(s,buf);
sscanf(buf,"%d",&re.nSates);
nStart=nEnd;
nEnd=str.Find(',',nStart+1);
s=str.Mid(nStart+1,nEnd-nStart-1);
Str2Str(s,buf);
sscanf(buf,"%f",&re.fHdop);
nStart=nEnd;
nEnd=str.Find(',',nStart+1);
s=str.Mid(nStart+1,nEnd-nStart-1);
Str2Str(s,buf);
sscanf(buf,"%f",&re.fAntenna);
nStart=nEnd;
nEnd=str.Find(',',nStart+1);
s=str.Mid(nStart+1,nEnd-nStart-1);
Str2Str(s,buf);
sscanf(buf,"%c",&re.cUnits_of_Antenna);
nStart=nEnd;
nEnd=str.Find(',',nStart+1);
s=str.Mid(nStart+1,nEnd-nStart-1);
Str2Str(s,buf);
sscanf(buf,"%f",&re.fGeoidal_separation);
nStart=nEnd;
nEnd=str.Find(',',nStart+1);
s=str.Mid(nStart+1,nEnd-nStart-1);
Str2Str(s,buf);
sscanf(buf,"%c",&re.cUnits_of_Geoidal);
nStart=nEnd;
nEnd=str.Find(',',nStart+1);
s=str.Mid(nStart+1,nEnd-nStart-1);
Str2Str(s,buf);
sscanf(buf,"%f",&re.fAge_of_Data);
nStart=nEnd;
nEnd=str.Find('*',nStart+1);
s=str.Mid(nStart+1,nEnd-nStart-1);
Str2Str(s,buf);
sscanf(buf,"%s",re.sStation_ID);
return re;
}
FPOINT GetPoint(const CWayPoint &p1,const CWayPoint &p2,const CWayPoint &p3)
{
FPOINT p;
double x1,y1,x2,y2,x3,y3;
x1=p1.c.CX,x2=p2.c.CX,x3=p3.c.CX;
y1=p1.c.CY,y2=p2.c.CY,y3=p3.c.CY;
double Dx=x1-x2,Dy=y1-y2;
if(fabs(Dx)<0.0001)
{
p.X=x1;
p.Y=y3;
}
else
{
p.X=( (y3-y2)*Dx*Dy+x3*Dx*Dx+x2*Dy*Dy )/(Dx*Dx+Dy*Dy);
p.Y=y2+Dy*(p.X-x2)/Dx;
}
return p;
}
double NavelMer(double lon,int base,int &index)
{
double na=0;
int n=0;
if(lon<0)
lon+=360.;
switch(base)
{
case 3:
n=int ((lon+1.5)/3.+0.5);
index=n;
na=index*3;
break;
case 6:
n=int ((lon)/6.+1);
index=n;
na=index*6-3;
break;
default :
na=index=-1;
}
na/=P2;
return na;
}
bool Gauss(const DBLH dd,CXYH &cc,const PARA pp)
{
double alfa;
double a;
alfa=pp.Alfa[0];
alfa=1.0/alfa;
a=pp.A[0];
int index=0;
double
radLat=dd.DB,
radLon=dd.DL;
double radL0=NavelMer(dd.DL*P2,6,index);
if(radL0==-1)
{
return false;
}
double H=dd.DH;
double coor_x=0,coor_y=0;
double b=a*(1-alfa),c=a*a/b,e=sqrt(1-(b/a)*(b/a)),e1=sqrt((a/b)*(a/b)-1);
double sinB=sin(radLat),cosB=cos(radLat),t=tan(radLat),
cosL=cos(radLon),sinL=sin(radLon),
ita=e1*cosB,V=sqrt(1+ita*ita),N=c/V;
double x,y,z;
x=(N+H)*cosB*cosL;
y=(N+H)*cosB*sinL;
z=(N*(1-e*e)+H)*sinB;
alfa=pp.Alfa[1];
alfa=1.0/alfa;
a=pp.A[1];
b=a*(1-alfa),c=a*a/b,e=sqrt(1-(b/a)*(b/a)),e1=sqrt((a/b)*(a/b)-1);
sinB=sin(radLat),cosB=cos(radLat),t=tan(radLat),
cosL=cos(radLon),sinL=sin(radLon),ita=e1*cosB,V=sqrt(1+ita*ita),N=c/V;
DBLH blh;
blh.DL=atan2(y,x);
double t1,t2,t0;
t2=t0=z/sqrt(x*x+y*y);
do
{
t1=t2;
t2=t0+c*e*e*t1/sqrt(x*x+y*y)/sqrt(1+e1*e1+t1*t1);
}
while(fabs(t2-t1)>E);
blh.DB=atan(t2);
blh.DH=sqrt(x*x+y*y)/cosB-N;
//正算
radLat=blh.DB,radLon=blh.DL;
radL0=NavelMer(radLon*P2,6,index);
sinB=sin(radLat),cosB=cos(radLat),t=tan(radLat),
cosL=cos(radLon),sinL=sin(radLon),ita=e1*cosB,V=sqrt(1+ita*ita),N=c/V;
double a0,a2,a4,a6,a8;
double m0,m2,m4,m6,m8;
double X;
m0=a*(1-e*e);
m2=3.0/2.0*e*e*m0;
m4=5.0/4.0*e*e*m2;
m6=7.0/6.0*e*e*m4;
m8=9.0/8.0*e*e*m6;
a0=m0+m2/2.0+3.0*m4/8.0+5.0*m6/16.0+35.0*m8/128.0;
a2=m2/2.0+m4/2.0+15.0*m6/32.0+7.0*m8/16.0;
a4=m4/8.0+3.0*m6/16.0+7.0*m8/32.0;
a6=m6/32.0+m8/16.0;
a8=m8/128.0;
double l=(radLon-radL0)*P1;
X=a0*radLat-sinB*cosB*((a2-a4+a6)+(2*a4-16.0*a6/3.0)*sinB*sinB+16.0/3.0*a6*sinB*sinB*sinB*sinB);
coor_x=X+N/2.0/P1/P1*sinB*cosB*l*l+N/24.0/P1/P1/P1/P1*sinB*cosB*cosB*cosB*(5.0-t*t+9*ita*ita+4*ita*ita*ita*ita)*l*l*l*l+N/720.0/pow(P1,6)*sinB*pow(cosB,5)*(61-58*t*t+t*t*t*t)*pow(l,6);
coor_y=N/P1*cosB*l+N/6.0/P1/P1/P1*cosB*cosB*cosB*(1.0-t*t+ita*ita)*l*l*l+N/120.0/pow(P1,5)*pow(cosB,5)*(5.0-18.0*t*t+t*t*t*t+14*ita*ita-58.0*ita*ita*t*t)*pow(l,5);
coor_y+=500000.;
coor_y+=index*1000000.;
cc.CX=coor_x;
cc.CY=coor_y;
cc.CH=dd.DH;//blh.DH;
return true;
}
bool InvGauss(const CXYH cc,DBLH &dd,const PARA pp)
{
return true;//暂时没有实现
}
double GetDist(const CWayPoint &wpt1,const CWayPoint &wpt2)
{
CXYH cc1,cc2;
wpt1.GetC(cc1);
wpt2.GetC(cc2);
double re=sqrt((cc1.CX-cc2.CX)*(cc1.CX-cc2.CX)+(cc1.CY-cc2.CY)*(cc1.CY-cc2.CY));
if(fabs(re)<0.1)
return 0;
else
return re;
}
double GetDist(const CWayPoint &wpt1,double x,double y)
{
CXYH cc1;
wpt1.GetC(cc1);
double re=sqrt((cc1.CX-x)*(cc1.CX-x)+(cc1.CY-y)*(cc1.CY-y));
if(fabs(re)<0.1)
return 0;
else
return re;
}
double GetBearing(const CWayPoint &wpt1,const CWayPoint &wpt2)
{
CXYH cc1,cc2;
wpt1.GetC(cc1);
wpt2.GetC(cc2);
return atan2((cc2.CY-cc1.CY),(cc2.CX-cc1.CX));
}
double GetHeight(const CWayPoint &wpt1,const CWayPoint &wpt2)
{
CXYH cc1,cc2;
wpt1.GetC(cc1);
wpt2.GetC(cc2);
return cc2.CH-cc1.CH;
}
double Dms2Rad(double dms)
{
int du,fen;
double miao;
du=int(dms+0.0001)%360;
fen=int((dms-du)*100+0.0001);
miao=(((dms-du)*100)-fen)*100;
return (du+fen/60.0+miao/3600.0)/180.0*PI;
}
double Rad2Dms(double rad)
{
while(rad<0)
rad+=2*PI;
while(rad>2*PI)
rad-=2*PI;
double dms=rad/PI*180.0;
int du,fen;
double miao;
du=int (dms+0.0001);
fen=int ((dms-du)*60+0.0001);
miao=(dms-(du+fen/60.0))*3600;
return du+fen/100.0+miao/10000;
}
void Str2Str(const CString str,char *tostr)
{
for(int i=0;i<str.GetLength();i++)
tostr[i]=(char)str[i];
tostr[i]=0;
}
TCHAR* GetUnicodeString(const char *s)
{
int nSize = strlen(s);
TCHAR *pUnicodeString = new TCHAR[nSize+1];
MultiByteToWideChar(CP_ACP, 0, s,-1,pUnicodeString,strlen(s));
return pUnicodeString;
}
void CMainFrame::OnCom()
{
int b=m_Cmb->GetCurSel();
if(m_nCurrentExample!=(UINT) b)
{
return;
}
ShowDisplayView(b);
}
void CMainFrame::OnMenuexit()
{
CFrameWnd::DestroyWindow();
}
void CMainFrame::OnCancelMode()
{
CFrameWnd::OnCancelMode();
}
void CMainFrame::OnExit()
{
if(::AfxMessageBox(_T("Exit Program?"),MB_OKCANCEL)!=IDOK)
return;
//int AfxMessageBox(LPCTSTR lpszText,UINT nType = MB_OK,UINT nIDHelp = 0 );
//if(::MessageBox(NULL,_T("Exit Program?"),_T("Warning!"),MB_OKCANCEL)!=IDOK)
// return;
CFrameWnd::DestroyWindow();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -