⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gpssimview.cpp

📁 GPS信号模拟器源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -