📄 ryxgpsview.cpp
字号:
// RyxGpsView.cpp : implementation of the CRyxGpsView class
//
#include "stdafx.h"
#include "RyxGps.h"
#include "MainFrm.h"
#include "RyxGpsDoc.h"
#include "RyxGpsView.h"
#include <stdio.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//----------------------------------------------------------------------------------
#define ID_TIMER 1
#define PI 3.1416
/////////////////////////////////////////////////////////////////////////////
// CRyxGpsView
IMPLEMENT_DYNCREATE(CRyxGpsView, CView)
BEGIN_MESSAGE_MAP(CRyxGpsView, CView)
//{{AFX_MSG_MAP(CRyxGpsView)
ON_COMMAND(ID_START, OnStart)
ON_UPDATE_COMMAND_UI(ID_START, OnUpdateStart)
ON_COMMAND(ID_END, OnEnd)
ON_UPDATE_COMMAND_UI(ID_END, OnUpdateEnd)
ON_WM_TIMER()
ON_WM_DESTROY()
ON_WM_ERASEBKGND()
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CRyxGpsView construction/destruction
CRyxGpsView::CRyxGpsView()
{
// TODO: add construction code here
m_BkBrush.CreateSolidBrush(RGB(0,0,200));
m_penWhite.CreatePen(PS_SOLID,0,RGB(255,255,255));
m_penYellow.CreatePen(PS_SOLID,0,RGB(255,255,0));
m_penRed.CreatePen(PS_SOLID,0,RGB(255,0,0));
m_NullBrush.CreateStockObject(NULL_BRUSH);
}
CRyxGpsView::~CRyxGpsView()
{
}
BOOL CRyxGpsView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CRyxGpsView drawing
void CRyxGpsView::OnDraw(CDC* pDC)
{
char pszNum[10];
char pszTemp[50];
int iNum;
int iOffset;
int i;
int alpha,sita;
int iIndex;
CRyxGpsDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->GetSubWord(22,pszNum);
iNum=atoi(pszNum);
if(pDoc->m_ReveiverID==1)
iOffset=22;
else if(pDoc->m_ReveiverID==2)
{
switch(iNum)
{
case 10:
iOffset=84;
break;
case 11:
iOffset=90;
break;
default:
break;
}
}
DrawAxis(pDC);
for(i=0;i<iNum;i++)
{
pDoc->GetSubWord(iOffset+i*6+1,pszTemp);
iIndex=atoi(pszTemp);
pDoc->GetSubWord(iOffset+i*6+2,pszTemp);
alpha=atoi(pszTemp);;
pDoc->GetSubWord(iOffset+i*6+3,pszTemp);
sita=atoi(pszTemp);
DrawPlanet(iIndex,alpha,sita,pDC);
}
}
/////////////////////////////////////////////////////////////////////////////
// CRyxGpsView diagnostics
#ifdef _DEBUG
void CRyxGpsView::AssertValid() const
{
CView::AssertValid();
}
void CRyxGpsView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CRyxGpsDoc* CRyxGpsView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CRyxGpsDoc)));
return (CRyxGpsDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CRyxGpsView message handlers
void CRyxGpsView::OnStart()
{
// TODO: Add your command handler code here
if(!m_bRunning)
{
char s[256];
CString str;
::GetCurrentDirectory(sizeof(s),s);
str=s;
if(str.GetAt(str.GetLength()-1)!='\\')
str+='\\';
str+="Atti.txt";
if((m_pFile=fopen(str,"rb"))==NULL)
{
MessageBox("Can't open File");
return;
}
else
{
m_bRunning=TRUE;
SetTimer(ID_TIMER,100,NULL);
}
}
}
void CRyxGpsView::OnUpdateStart(CCmdUI* pCmdUI)
{
pCmdUI->Enable(!m_bRunning);
}
void CRyxGpsView::OnEnd()
{
if(m_bRunning)
{
m_bRunning=FALSE;
KillTimer(ID_TIMER);
fclose(m_pFile);
}
}
void CRyxGpsView::OnUpdateEnd(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_bRunning);
}
void CRyxGpsView::OnInitialUpdate()
{
CView::OnInitialUpdate();
m_bRunning=FALSE;
}
void CRyxGpsView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CRyxGpsDoc* pDoc = GetDocument();
char chPrevious;
char chCurrent;
int i=0;
chPrevious=0;
while(i<3000)
{
chCurrent=fgetc(m_pFile);
if(feof(m_pFile))
OnEnd();
if((chCurrent==0x0d)&&(chPrevious==0x0a)) //find 2 CR ('\n')
break;
pDoc->m_buffer[i]=chCurrent;
i++;
chPrevious=chCurrent;
}
pDoc->m_buffer[i]='\0';
Invalidate(); //notify to update
POSITION pos = pDoc->GetFirstViewPosition();
while (pos != NULL)
{
CView* pView = pDoc->GetNextView(pos);
if(pView!=this)
pView->SendMessage(WM_MYNOTIFY,0,0);
}
CView::OnTimer(nIDEvent);
}
void CRyxGpsView::OnDestroy()
{
CView::OnDestroy();
if(m_bRunning)
{
m_bRunning=FALSE;
KillTimer(ID_TIMER);
fclose(m_pFile);
}
}
BOOL CRyxGpsView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CRect rect;
GetClientRect(&rect);
pDC->FillRect(&rect,&m_BkBrush);
return TRUE;
}
void CRyxGpsView::DrawAxis(CDC *pDC)
{
CRect rect;
int iWidth;
char strNum[10];
CRyxGpsDoc* pDoc = GetDocument();
pDoc->GetSubWord(22,strNum);
GetClientRect(&rect);
iWidth=min(rect.Width(),rect.Height());
rect.right=rect.bottom=iWidth;
rect.InflateRect(-2,-2);
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(0,255,0));
pDC->SelectObject(&m_penWhite);
pDC->MoveTo(rect.left,(rect.top+rect.bottom)/2);
pDC->LineTo(rect.right,(rect.top+rect.bottom)/2);
pDC->MoveTo((rect.left+rect.right)/2,rect.top);
pDC->LineTo((rect.left+rect.right)/2,rect.bottom);
rect.InflateRect(-30,-30);
pDC->TextOut(rect.right+20,(rect.top+rect.bottom)/2,CString("0"));
pDC->TextOut(rect.right+20,(rect.top+rect.bottom)/2-20,CString("90"));
pDC->TextOut((rect.right+rect.left)/2,rect.top-20,CString("0"));
pDC->TextOut((rect.right+rect.left)/2-30,rect.top-20,CString("360"));
pDC->TextOut(rect.left-30,(rect.top+rect.bottom)/2-20,CString("270"));
pDC->TextOut((rect.right+rect.left)/2,rect.bottom,CString("180"));
pDC->TextOut((rect.right+rect.left)/2+20,rect.top-20,CString("卫星天空视图"));
pDC->TextOut((rect.right+rect.left)/2+50,rect.bottom,CString("可用卫星数目: ")+strNum);
pDC->SelectObject(&m_NullBrush);
pDC->SelectObject(&m_penYellow);
pDC->Ellipse(&rect);
int delta;
delta=(int)(0.5*(double)rect.Width()*(1.0-cos(PI/6)));
pDC->Ellipse(rect.left+delta,rect.top+delta,rect.right-delta,rect.bottom-delta);
pDC->TextOut(rect.right-delta,(rect.top+rect.bottom)/2,CString("30"));;
rect.InflateRect(-rect.Width()/4,-rect.Height()/4);
pDC->Ellipse(&rect);
pDC->TextOut(rect.right,(rect.top+rect.bottom)/2,CString("60"));
pDC->TextOut((rect.right+rect.left)/2,(rect.top+rect.bottom)/2,CString("90"));
}
POINT CRyxGpsView::ConvertToLogic(int alpah, int sita)
{
CRect rect;
POINT pt,pt_ret;
int iWidth;
double R,r;
GetClientRect(&rect);
iWidth=min(rect.right,rect.bottom);
rect.right=rect.bottom=iWidth;
rect.InflateRect(-32,-32);
R=rect.Width()/2.0;
r=R*cos(PI*(double)alpah/180.0);
pt.x=(int)(r*cos(PI*(double)sita/180));
pt.y=(int)(r*sin(PI*(double)sita/180)); //变为导航直角坐标
iWidth=pt.x;
pt.x=pt.y;
pt.y=iWidth; //变为笛卡儿直角坐标
pt_ret.x=pt.x+(rect.right+rect.left)/2;
pt_ret.y=(rect.bottom+rect.top)/2-pt.y; //变为设备坐标系
return pt_ret;
}
void CRyxGpsView::DrawPlanet(int iIndex,int alpah, int sita,CDC *pDC)
{
POINT pt;
char s[3];
wsprintf(s,"%d",iIndex);
pDC->SelectObject(&m_penRed);
pt=ConvertToLogic(alpah,sita);
pDC->Ellipse(pt.x-10,pt.y-10,pt.x+10,pt.y+10);
pDC->SetTextColor(RGB(0,255,255));
pDC->TextOut(pt.x-7,pt.y-7,s,lstrlen(s));
}
void CRyxGpsView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CString str,str1;
CRect rect;
CRgn rgn;
double alpha,sita;
double cos_alpha;
double sin_sita,cos_sita;
double distance;
CPoint ptOrigin;
GetClientRect(&rect);
rect.right=rect.bottom=min(rect.right,rect.bottom);
rect.InflateRect(-32,-32);
ptOrigin.x=(rect.left+rect.right)/2;
ptOrigin.y=(rect.top+rect.bottom)/2;
rgn.CreateEllipticRgn(rect.left,rect.top,rect.right,rect.bottom);
CMainFrame *pFrame=(CMainFrame *)AfxGetMainWnd();
if(rgn.PtInRegion(point))
{
distance=sqrt(pow(ptOrigin.x-point.x,2)+pow(ptOrigin.y-point.y,2));
cos_alpha=distance/(rect.Width()/2.0);
alpha=acos(cos_alpha);
str.Format("高度角α=%.2f",alpha*180.0/PI);
sin_sita=(point.x-ptOrigin.x)/distance;
cos_sita=-(point.y-ptOrigin.y)/distance;
sita=acos(cos_sita);
if(sin_sita>=0)
sita=sita*180.0/PI;
else
sita=-sita*180.0/PI+360;
str1.Format(",方位角θ=%f",sita);
str+=str1;
pFrame->m_wndStatusBar.SetPaneText(2,str);
}
else
pFrame->m_wndStatusBar.SetPaneText(2,"工作正常!");
CView::OnMouseMove(nFlags, point);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -