📄 gpssimview.cpp
字号:
// GPSSimView.cpp : implementation of the CGPSSimView class
//
#include "stdafx.h"
#include "GPSSim.h"
#include "GPSSimDoc.h"
#include "GPSSimView.h"
#include "MainFrm.h"
#include "NoisePage.h"
#include "NormalSetPage.h"
#include <atlimage.h>
#include ".\gpssimview.h"
#pragma comment(lib, "Msimg32.lib")
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
const RECT g_rectTrack = {10,10, 490, 370};
const COLORREF g_crSpeed[18] =
{
RGB(0,0,255),
RGB(32,0,255),
RGB(64,0,255),
RGB(96,0,255),
RGB(128,0,255),
RGB(160,0,255),
RGB(192,0,255),
RGB(224,0,255),
RGB(255,0,255),
RGB(255,0,255),
RGB(255,0,224),
RGB(255,0,192),
RGB(255,0,160),
RGB(255,0,128),
RGB(255,0,96),
RGB(255,0,64),
RGB(255,0,32),
RGB(255,0,0),
};
/////////////////////////////////////////////////////////////////////////////
// CGPSSimView
IMPLEMENT_DYNCREATE(CGPSSimView, CFormView)
BEGIN_MESSAGE_MAP(CGPSSimView, CFormView)
//{{AFX_MSG_MAP(CGPSSimView)
ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, OnSelchangeTab1)
ON_WM_TIMER()
ON_WM_PAINT()
ON_COMMAND(ID_SIGNAL_BEGIN, OnSignalBegin)
ON_COMMAND(ID_SIGNAL_PAUSE, OnSignalPause)
ON_COMMAND(ID_SIGNAL_STOP, OnSignalStop)
ON_UPDATE_COMMAND_UI(ID_SIGNAL_PAUSE, OnUpdateSignalPause)
ON_UPDATE_COMMAND_UI(ID_SIGNAL_STOP, OnUpdateSignalStop)
ON_UPDATE_COMMAND_UI(ID_SIGNAL_BEGIN, OnUpdateSignalBegin)
ON_COMMAND(ID_SET_SCALE_ADD, OnSetScaleAdd)
ON_COMMAND(ID_SET_SCALE_SUB, OnSetScaleSub)
ON_UPDATE_COMMAND_UI(ID_SIGNAL_TRN, OnUpdateSignalTrn)
ON_UPDATE_COMMAND_UI(ID_SIGNAL_ORI, OnUpdateSignalOri)
ON_COMMAND(ID_SIGNAL_ORI, OnSignalOri)
ON_COMMAND(ID_SIGNAL_TRN, OnSignalTrn)
//}}AFX_MSG_MAP
ON_COMMAND(ID_SET_PROPERTY, OnSetProperty)
ON_WM_HSCROLL()
ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER1, OnNMReleasedcaptureSlider1)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGPSSimView construction/destruction
CGPSSimView::CGPSSimView()
: CFormView(CGPSSimView::IDD)
{
//{{AFX_DATA_INIT(CGPSSimView)
m_textRaw = _T("");
//}}AFX_DATA_INIT
// TODO: add construction code here
// 没有开始发送信号
m_bSignalStart = false;
// 没有暂停发送信号
m_bSignalPause = false;
// 显示原始信号
m_bShowSignal = false;
}
CGPSSimView::~CGPSSimView()
{
}
void CGPSSimView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CGPSSimView)
DDX_Control(pDX, IDC_SLIDER1, m_slider);
DDX_Control(pDX, IDC_TAB1, m_table);
DDX_Text(pDX, IDC_EDIT2, m_textRaw);
DDX_Control(pDX, IDC_LIST2, m_list);
//}}AFX_DATA_MAP
}
BOOL CGPSSimView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.style = WS_CHILD;
return CFormView::PreCreateWindow(cs);
}
void CGPSSimView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
//TabCtrl-------------------------------------------------------------
m_table.DeleteAllItems();
TCITEM item;
item.pszText = "速度";
item.mask = TCIF_TEXT;
m_table.InsertItem(1, &item);
item.pszText = "高度";
m_table.InsertItem(2, &item);
item.pszText = "速度统计";
m_table.InsertItem(3, &item);
item.pszText = "高度统计";
m_table.InsertItem(4, &item);
LRESULT lResult;
m_table.SetCurSel(0);
OnSelchangeTab1(NULL, &lResult);
m_list.DeleteAllItems();
while(m_list.DeleteColumn(0));
m_list.InsertColumn(0, "时间", LVCFMT_LEFT, 60);
m_list.InsertColumn(1, "经度", LVCFMT_LEFT, 60);
m_list.InsertColumn(2, "纬度", LVCFMT_LEFT, 60);
m_list.InsertColumn(3, "速度", LVCFMT_LEFT, 45);
m_list.InsertColumn(4, "方向", LVCFMT_LEFT, 45);
m_list.InsertColumn(5, "高度", LVCFMT_LEFT, 45);
SetTrackScale(800, 600);
}
/////////////////////////////////////////////////////////////////////////////
// CGPSSimView diagnostics
#ifdef _DEBUG
void CGPSSimView::AssertValid() const
{
CFormView::AssertValid();
}
void CGPSSimView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
CGPSSimDoc* CGPSSimView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGPSSimDoc)));
return (CGPSSimDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CGPSSimView message handlers
void CGPSSimView::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
{
int item = m_table.GetCurSel();
m_chart.SetYTicks(10);
m_chart.RemoveDataSet(0);
if (item == 0)
{
m_chart.SetTitle("速度");
m_chart.SetRangeY(0,50);
m_chart.SetYTicks(10);
m_chart.SetDatasetStyle(0, HMX_DATASET_STYLE_LINE);
m_chart.SetDatasetMarker(0, HMX_DATASET_MARKER_SPH);
m_chart.SetDatasetPenColor(0, RGB(255,0,0));
m_chart.SetDatasetPenSize(0, 1);
for (int i = 0; i < 20; i++)
{
char buff[10];
itoa(i, buff, 10);
m_chart.SetData(0,0);
m_chart.SetXScaleLabel(i, buff);
}
}
else if (item == 1)
{
m_chart.SetTitle("高度");
m_chart.SetRangeY(0,10);
m_chart.SetYTicks(10);
m_chart.SetDatasetStyle(0, HMX_DATASET_STYLE_LINE);
m_chart.SetDatasetMarker(0, HMX_DATASET_MARKER_SPH);
m_chart.SetDatasetPenColor(0, RGB(0,255,0));
m_chart.SetDatasetPenSize(0, 1);
for (int i = 0; i < 20; i++)
{
char buff[10];
itoa(i, buff, 10);
m_chart.SetData(0,0);
m_chart.SetXScaleLabel(i, buff);
}
}
else if (item == 2)
{
m_chart.SetTitle("速度分布");
m_chart.SetRangeY(0,1);
m_chart.SetYTicks(10);
m_chart.SetDatasetStyle(0, HMX_DATASET_STYLE_VBAR);
m_chart.SetDatasetPenColor(0, RGB(0,192,255));
m_chart.SetDatasetPenSize(0, 6);
for (int i = 0; i < 20; i++)
{
char buff[10];
itoa(i*5, buff, 10);
m_chart.SetData(0,0);
m_chart.SetXScaleLabel(i, buff);
}
}
else if (item == 3)
{
m_chart.SetTitle("高度分布");
m_chart.SetRangeY(0,1);
m_chart.SetYTicks(10);
m_chart.SetDatasetStyle(0, HMX_DATASET_STYLE_VBAR);
m_chart.SetDatasetPenColor(0, RGB(255,192,192));
m_chart.SetDatasetPenSize(0, 6);
for (int i = 0; i < 20; i++)
{
char buff[10];
itoa(i*5, buff, 10);
m_chart.SetData(0,0);
m_chart.SetXScaleLabel(i, buff);
}
}
Invalidate();
UpdateWindow();
*pResult = 0;
}
void CGPSSimView::OnTimer(UINT nIDEvent)
{
CGPSSimDoc *pDoc = GetDocument();
if (pDoc->Next() == 0)
{
const vector<KNPosition>& allpos = CGPSSimDoc::m_bDisplayFlag?
pDoc->GetAllTrnPos():
pDoc->GetAllRawPos();
if (allpos.empty()) return;
const KNPosition &pos = allpos.back();
SetTrackCenter(pos.longitude, pos.latitude);
CClientDC dc(this);
CDC *pDC = &dc;//GetDC();
RefreshChart();
RefreshText();
DrawAllTrack(pDC);
RefreshList();
CMainFrame *pWnd = static_cast<CMainFrame*>(AfxGetMainWnd());
pWnd->m_dlgFloat.SendMessage(WM_USER+12, 0, 0);
m_slider.SetPos(1+m_slider.GetPos());
ReleaseDC(pDC);
}
else
{
KillTimer(1212);
m_bSignalStart = false;
}
//TRACE("%s, (%d, %d)\n", pos.time, pos.longitude, pos.latitude);
//CFormView::OnTimer(nIDEvent);
}
//--------------------------------------------------------
// 设置轨迹中心坐标
void CGPSSimView::SetTrackCenter(long lngi, long lati)
{
m_centerLngi = lngi;
m_centerLati = lati;
}
// 设置轨迹缩放比例
void CGPSSimView::SetTrackScale(long scaleLongitude, long scaleLatitude)
{
m_scaleLngi = scaleLatitude;
m_scaleLati = scaleLatitude;
}
void CGPSSimView::DrawTrack(CDC *pDC, long lngi, long lati, COLORREF color, int size)
{
ASSERT(pDC != NULL);
// 计算屏幕坐标
int x, y;
CoordToPixel(lngi, lati, x, y);
if (x > g_rectTrack.left && x < g_rectTrack.right &&
y > g_rectTrack.top && y < g_rectTrack.bottom)
{
//pDC->SetPixel(x, y, color);
if (size != 0)
{
CBrush br(color);
RECT rect = {x-size, y-size, x+size, y+size};
pDC->FillRect(&rect, &br);
}
else
{
CPen pen(PS_SOLID, 1, RGB(255,0,0));
CBrush br(RGB(255,0,0));
HPEN hpen = (HPEN)pDC->SelectObject(&pen);
HBRUSH hbr = (HBRUSH)pDC->SelectObject(&br);
pDC->Ellipse(x-2, y-2, x+2, y+2);
pDC->SelectObject(hpen);
pDC->SelectObject(hbr);
}
}
}
void CGPSSimView::CoordToPixel(long lngi, long lati, int &x, int &y)
{
float fx = float(lngi - m_centerLngi) / (float)m_scaleLngi;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -