📄 floatdlg.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 + -