📄 satpicture.cpp
字号:
// SatPicture.cpp : implementation file
//
#include "stdafx.h"
#include "Parser.h"
#include "SatPicture.h"
#include "NmeaParser.h"
#include "comdef.h"
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define HEIGHT_MARGIN 6
#define WIDTH_MARGIN 6
#define PI 3.14159265358979
/////////////////////////////////////////////////////////////////////////////
// CSatPicture
CSatPicture::CSatPicture() : m_bParamsCaluclated(false)
{
int i;
for (i=0; i< 12; i++) {
m_vecFixSatellitePRNs[i] = 0;
m_vecSatelliteInViewPRNs[i] = 0;
m_vecAz[i] = 0;
m_vecEl[i] = 0;
m_vecSNR[i] = 0;
}
}
CSatPicture::~CSatPicture()
{
}
BEGIN_MESSAGE_MAP(CSatPicture, CStatic)
//{{AFX_MSG_MAP(CSatPicture)
ON_WM_PAINT()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSatPicture message handlers
void CSatPicture::OnPaint()
{
CPaintDC dc(this); // device context for painting
if(!m_bParamsCaluclated)
{
// Set our parameters
GetClientRect(&m_clientRect);
m_outerCircle.left = m_clientRect.left + WIDTH_MARGIN;
m_outerCircle.right = m_clientRect.right - WIDTH_MARGIN;
m_outerCircle.top = m_clientRect.top + HEIGHT_MARGIN;
m_outerCircle.bottom = m_clientRect.bottom - HEIGHT_MARGIN;
m_outerCircleRadius = (m_outerCircle.right - m_outerCircle.left)/2;
m_innerCircle.left = m_outerCircle.left + (m_outerCircleRadius / 2);
m_innerCircle.right = m_outerCircle.right - (m_outerCircleRadius / 2);
m_innerCircle.top = m_outerCircle.top + (m_outerCircleRadius / 2);
m_innerCircle.bottom = m_outerCircle.bottom - (m_outerCircleRadius / 2);
m_tinyCircle.left = m_outerCircle.left + m_outerCircleRadius - 2;
m_tinyCircle.right = m_outerCircle.right - (m_outerCircleRadius - 2);
m_tinyCircle.top = m_outerCircle.top + (m_outerCircleRadius - 2);
m_tinyCircle.bottom = m_outerCircle.bottom - (m_outerCircleRadius - 2);
m_bParamsCaluclated = true;
}
// Draw background
// Clear client area
CBrush bgBrush(GetSysColor(COLOR_BTNFACE));
dc.FillRect(&m_clientRect, &bgBrush);
// Clear brush fill
dc.SelectStockObject(NULL_BRUSH);
// Set FG, BG colors and font
dc.SetBkColor(GetSysColor(COLOR_BTNFACE));
dc.SetTextColor(CIRCLECOLOR);
dc.SelectStockObject(SYSTEM_FONT);
CPen thePen(PS_SOLID, 0, CIRCLECOLOR);
dc.SelectObject(thePen);
// Draw circles
dc.Ellipse(&m_outerCircle);
dc.Ellipse(&m_innerCircle);
dc.Ellipse(&m_tinyCircle);
// Compass point labels
dc.ExtTextOut(m_outerCircle.left + m_outerCircleRadius - 3, m_outerCircle.top - 6, ETO_OPAQUE, NULL, "N", NULL);
dc.ExtTextOut(m_outerCircle.right - 5, m_outerCircle.top + m_outerCircleRadius - 7, ETO_OPAQUE, NULL, "E", NULL);
dc.ExtTextOut(m_outerCircle.left + m_outerCircleRadius - 3, m_outerCircle.bottom - 7, ETO_OPAQUE, NULL, "S", NULL);
dc.ExtTextOut(m_outerCircle.left - 4, m_outerCircle.top + m_outerCircleRadius - 7, ETO_OPAQUE, NULL, "W", NULL);
// Calculate and draw satellite positions
double r, x, y;
long centerPoint = m_outerCircle.left + m_outerCircleRadius;
CString strPRN;
char lpszPRN[3];
bool bIsFixSat;
int i, j;
int mode=0;
for(i = 0; i < 12; i++)
{
bIsFixSat = false;
//if(i < SNRBarUbound)
r = ((90. - m_vecEl[i]) / 90.) * m_outerCircleRadius;
x = (sin(m_vecAz[i] * PI / 180.) * r) + centerPoint;
y = -(cos(m_vecAz[i] * PI / 180.) * r) + centerPoint;
// Determine whether this satellite is a fix satellite
if ( m_vecFixSatellitePRNs[i] ) bIsFixSat = true;
#if 0
if(bIsFixSat)
dc.SetBkColor(FIXSATCOLOR);
else
dc.SetBkColor(SATINVIEWCOLOR);
if ( m_vecSNR[i] ) {
strPRN.Format(_T("%02d"),m_vecSatelliteInViewPRNs[i]);
dc.SetTextColor(SATTEXTCOLOR);
dc.ExtTextOut((int)x-5, (int)y-5, ETO_OPAQUE, NULL, strPRN, NULL);
}
#else
if ( bIsFixSat ) mode = 1;
else if ( m_vecSNR[i] ) mode = 2;
else mode = 3;
if (m_vecSatelliteInViewPRNs[i]) DrawCircle(&dc, x, y, mode);
#endif
}
// Do not call CStatic::OnPaint() for painting messages
}
void CSatPicture::DrawSatellites(CNPSatInfo satInfo[])
{
int i;
for ( i=0;i<12;i++) {
m_vecFixSatellitePRNs[i] = satInfo[i].m_bUsedInSolution;
m_vecSatelliteInViewPRNs[i] = satInfo[i].m_wPRN;
m_vecAz[i] = satInfo[i].m_wAzimuth;
m_vecEl[i] = satInfo[i].m_wElevation;
m_vecSNR[i] = satInfo[i].m_wSignalQuality;
}
Invalidate();
}
void CSatPicture::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CStatic::OnTimer(nIDEvent);
}
BOOL CSatPicture::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}
void CSatPicture::DrawCircle(CPaintDC *dc, int x, int y, int mode)
{
CBrush brush;
switch ( mode )
{
case 0: brush.CreateSolidBrush(RGB(0,0,255));break;
case 1: brush.CreateSolidBrush(FIXSATCOLOR);break;
case 2: brush.CreateSolidBrush(SATINVIEWCOLOR);break;
case 3: brush.CreateSolidBrush(SATNOSNR);break;
default:brush.CreateSolidBrush(RGB(255,255,255));break;
}
dc->SelectObject(brush);
dc->Ellipse(x-4,y-4,x+4,y+4);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -