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

📄 floatdlg.cpp

📁 GPS信号模拟器源代码
💻 CPP
字号:
// FloatDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "GPSSim.h"
#include "GPSSimDoc.h"
#include "FloatDlg.h"
#include ".\floatdlg.h"
using namespace Gdiplus;


const float g_fMinSpeed = 2.0f;
const int g_nHeightBase = 0;
const RECT g_rectSpeed = {393, 12, 493, 112};
const RECT g_rectSpeedArrow = {16, 253, 116, 353};
const RECT g_rectCompass = {380, 0, 480, 100};
const RECT g_rectCompassArrow = {393, 12, 493, 112};
const RECT g_rectTime = {0, 0, 80, 25};
const RECT g_rectHeight = {435, 160, 480, 360};


// CFloatDlg 对话框

IMPLEMENT_DYNAMIC(CFloatDlg, CDialog)
CFloatDlg::CFloatDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CFloatDlg::IDD, pParent)
{
	m_fDirection = 0.0f;
	m_fSpeed = 0.0f;
	m_fHeight = 0.0f;

	m_pTime[0] = '0';
	m_pTime[1] = '0';
	m_pTime[2] = '0';
	m_pTime[3] = '0';
	m_pTime[4] = '0';
	m_pTime[5] = '0';
	m_pTime[6] = 0;
}


CFloatDlg::~CFloatDlg()
{
}

void CFloatDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CFloatDlg, CDialog)
	ON_WM_PAINT()
	ON_WM_ERASEBKGND()
	ON_WM_TIMER()
	ON_MESSAGE(WM_USER+12, OnRefresh)
END_MESSAGE_MAP()


// CFloatDlg 消息处理程序

BOOL CFloatDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	DWORD dwStyle = GetWindowLong(m_hWnd, GWL_EXSTYLE);
	SetWindowLong(m_hWnd, GWL_EXSTYLE, dwStyle|WS_EX_LAYERED);
	::SetLayeredWindowAttributes(m_hWnd, RGB(52,69,53), 155, LWA_ALPHA|LWA_COLORKEY);

	return TRUE;  // return TRUE unless you set the focus to a control
}

void CFloatDlg::OnPaint()
{
	CPaintDC dc(this); // device context for painting

	DrawBkgnd(dc.m_hDC);
	DrawCompass(dc.m_hDC);
	DrawSpeed(dc.m_hDC);
	DrawTime(dc.m_hDC);
	DrawHeight(dc.m_hDC);
	DrawNumber(dc.m_hDC);

}

BOOL CFloatDlg::OnEraseBkgnd(CDC* pDC)
{
	RECT rect;
	GetClientRect(&rect);
	CBrush br(RGB(52,69,53));
	pDC->FillRect(&rect, &br);
	return TRUE;//CDialog::OnEraseBkgnd(pDC);
}

void CFloatDlg::OnTimer(UINT nIDEvent)
{
	Invalidate();
	UpdateWindow();
	CDialog::OnTimer(nIDEvent);
}

void CFloatDlg::DrawBkgnd(HDC hDC)
{
	CDC dcMem;
	CBitmap bmp;
	RECT rectSrc = {0, 0, 180, 124};
	dcMem.CreateCompatibleDC(NULL);

	// 速度
	bmp.LoadBitmap(IDB_SPEED);
	dcMem.SelectObject(bmp);
	BitBlt(hDC, 0, 236, 180, 124,dcMem.m_hDC, 0, 0, SRCCOPY);
	bmp.DeleteObject();

	// 指南针
	bmp.LoadBitmap(IDB_COMPASS);
	dcMem.SelectObject(bmp);
	BitBlt(hDC, 380, 0, 100, 100,dcMem.m_hDC, 0, 0, SRCCOPY);
	bmp.DeleteObject();

	// 时间
	bmp.LoadBitmap(IDB_TIME);
	dcMem.SelectObject(bmp);
	BitBlt(hDC, 0, 0, 80, 25, dcMem.m_hDC, 0, 0, SRCCOPY);
	bmp.DeleteObject();

	// 高度
	bmp.LoadBitmap(IDB_HEIGHT);
	dcMem.SelectObject(bmp);
	BitBlt(
		hDC, 
		g_rectHeight.left,
		g_rectHeight.top,
		g_rectHeight.right-g_rectHeight.left,
		g_rectHeight.bottom-g_rectHeight.top,
		dcMem.m_hDC, 
		0,
		0,
		SRCCOPY);
	bmp.DeleteObject();

	
	dcMem.DeleteDC();
}

void CFloatDlg::DrawCompass(HDC hDC)
{
	HDC hMemDC = CreateCompatibleDC(NULL);
	void *pbits;
	BITMAPINFOHEADER header = 
	{
		sizeof(BITMAPINFOHEADER), // size
			100, // width
			100, // height
			1, // plane
			24, // bitcount
			BI_RGB, // compress
			0, // image size
			0, // x pexel per meter
			0, // y pexel per meter
			0, // color used
			0, // color imporant
	};

	HBITMAP hBitmap = CreateDIBSection(
		NULL, 
		(BITMAPINFO*)&header, 
		DIB_RGB_COLORS,
		&pbits,
		NULL,
		0);

	SelectObject(hMemDC, hBitmap);

	HBRUSH hbr = CreateSolidBrush(RGB(0,0,0));
	RECT rect = {0,0,100,100};
	FillRect(hMemDC, &rect, hbr);

	Bitmap bitmap(AfxGetInstanceHandle(), (WCHAR*)MAKEINTRESOURCE(IDB_COMPASS_ARROW));
	Graphics graphics(hMemDC);

	graphics.TranslateTransform(38,38);

	graphics.RotateTransform(m_fDirection);	

	graphics.DrawImage(&bitmap, -38, -38);

	TransparentBlt(
			hDC, 
			393, 
			12, 
			100,
			100, 
			hMemDC, 
			0, 
			0, 
			100, 
			100, 
			RGB(0,0,0));

	DeleteObject(hbr);
	DeleteDC(hMemDC);
	DeleteObject(hBitmap);
}

void CFloatDlg::DrawSpeed(HDC hDC)
{
	HDC hMemDC = CreateCompatibleDC(NULL);
	void *pbits;
	BITMAPINFOHEADER header = 
	{
		sizeof(BITMAPINFOHEADER), // size
			100, // width
			100, // height
			1, // plane
			24, // bitcount
			BI_RGB, // compress
			0, // image size
			0, // x pexel per meter
			0, // y pexel per meter
			0, // color used
			0, // color imporant
	};

	HBITMAP hBitmap = CreateDIBSection(
		NULL, 
		(BITMAPINFO*)&header, 
		DIB_RGB_COLORS,
		&pbits,
		NULL,
		0);

	SelectObject(hMemDC, hBitmap);

	HBRUSH hbr = CreateSolidBrush(RGB(0,0,0));
	RECT rect = {0,0,100,100};
	FillRect(hMemDC, &rect, hbr);

	Bitmap bitmap(AfxGetInstanceHandle(), (WCHAR*)MAKEINTRESOURCE(IDB_SPEED_ARROW));
	Graphics graphics(hMemDC);

	graphics.TranslateTransform(45,45);

	graphics.RotateTransform(m_fSpeed*9/8);	

	graphics.DrawImage(&bitmap, -45, -45);

	TransparentBlt(
		hDC, 
		16, 
		253, 
		100,
		100, 
		hMemDC, 
		0, 
		0, 
		100, 
		100, 
		RGB(0,0,0));

	DeleteObject(hbr);
	DeleteDC(hMemDC);
	DeleteObject(hBitmap);

}

LRESULT CFloatDlg::OnRefresh(WPARAM wParam, LPARAM lParam)
{
	CFrameWnd *pWnd = static_cast<CFrameWnd*>(AfxGetMainWnd());

	ASSERT(pWnd != NULL);

	CGPSSimDoc *pDoc = static_cast<CGPSSimDoc*>(pWnd->GetActiveDocument());

	ASSERT(pDoc != NULL);
		
	const vector<KNPosition>& allpos = CGPSSimDoc::m_bDisplayFlag?
		pDoc->GetAllTrnPos():
	pDoc->GetAllRawPos();

	if (allpos.empty()) return 0;

	const KNPosition &pos = allpos.back();

	m_fSpeed = pos.speed;

	m_fHeight = pos.height;

	if (m_fSpeed > g_fMinSpeed)
		m_fDirection = pos.direction;

	strcpy(m_pTime, pos.time);

	HDC hDC = ::GetDC(m_hWnd);
	
	DrawBkgnd(hDC);
	DrawCompass(hDC);
	DrawSpeed(hDC);
	DrawTime(hDC);
	DrawHeight(hDC);
	DrawNumber(hDC);

	::ReleaseDC(m_hWnd, hDC);

	return 0;
}
void CFloatDlg::DrawTime(HDC hDC)
{
	if (strlen(m_pTime) > 5)
	{
		char buff[10] ={m_pTime[0], m_pTime[1], ':', 
						m_pTime[2], m_pTime[3], ':',
						m_pTime[4], m_pTime[5], 0};
		
		
		RECT rect = {0,0, g_rectTime.right, g_rectTime.bottom};
		SetBkMode(hDC, TRANSPARENT);
		SetTextColor(hDC, RGB(255,255,255));
		DrawText(hDC, buff, 8, &rect, DT_CENTER|DT_SINGLELINE|DT_VCENTER);
	}
}

void CFloatDlg::DrawNumber(HDC hDC)
{
	CBitmap bmp;
	CDC dcMem;
	dcMem.CreateCompatibleDC(NULL);
	bmp.LoadBitmap(IDB_NUMBER);
	dcMem.SelectObject(bmp);

	int speed = m_fSpeed;

	int s = speed % 10;

	RECT rect = {125, 326, 125+24,326+27};
	BitBlt(
		hDC, 
		rect.left,
		rect.top,
		rect.right-rect.left,
		rect.bottom-rect.top,
		dcMem.m_hDC,
		24*s,
		0,
		SRCCOPY);

	s = (speed/10) % 10;

	if (s > 0)
	{
		rect.left -= 24;
		rect.right -= 24;

		BitBlt(
			hDC, 
			rect.left,
			rect.top,
			rect.right-rect.left,
			rect.bottom-rect.top,
			dcMem.m_hDC,
			24*s,
			0,
			SRCCOPY);
	}

	s = (speed/100) % 10;
	if (s > 0)
	{
		rect.left -= 24;
		rect.right -= 24;

		BitBlt(
			hDC, 
			rect.left,
			rect.top,
			rect.right-rect.left,
			rect.bottom-rect.top,
			dcMem.m_hDC,
			24*s,
			0,
			SRCCOPY);
	}
}


void CFloatDlg::DrawHeight(HDC hDC)
{
	CBitmap bmp;
	CDC dcMem;
	dcMem.CreateCompatibleDC(NULL);
	bmp.LoadBitmap(IDB_HEIGHT_ARROW);
	dcMem.SelectObject(bmp);

	// 文字
	// metre/pixel
	CFont font;
	font.CreateFont(10, 0, 0, 0, FW_LIGHT, 0, 0, 0, ANSI_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, CLEARTYPE_QUALITY, VARIABLE_PITCH , "Fixed");
	SelectObject(hDC, font);
	SetBkMode(hDC, TRANSPARENT);
	SetTextColor(hDC, RGB(255,255,255));

	char buff[10];
	int scale = g_nHeightBase;
	int y = 325;

	for (int i = 0; i < 11; i++)
	{
		itoa(scale, buff, 10);
		TextOut(hDC, 460, y, buff, strlen(buff));

		y -= 15;
        scale += 10;
	}


	// 浮标
	y = 325 + 3*(g_nHeightBase - m_fHeight)/2;
	if (y < 165) y = 165;

	RECT rect = {438,y,438+19,y+10};

	TransparentBlt(
			hDC, 
			rect.left,
			rect.top,
			rect.right-rect.left,
			rect.bottom-rect.top,
			dcMem.m_hDC,
			0,
			0,
			19,
			10,
			RGB(52,69,53));
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -