📄 demo3view.cpp
字号:
// Demo3View.cpp : implementation of the CDemo3View class
//
#include "stdafx.h"
#include "Demo3.h"
#include "map.h"
#include "Dynamic.h"
#include "ShipInfo.h"
#include "TcpData.h"
#include "DisplayLen.h"
#include "proj.h"
#include "Demo3Doc.h"
#include "Demo3View.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDemo3View
IMPLEMENT_DYNCREATE(CDemo3View, CView)
BEGIN_MESSAGE_MAP(CDemo3View, CView)
//{{AFX_MSG_MAP(CDemo3View)
ON_WM_SIZE()
ON_WM_LBUTTONDOWN()
ON_COMMAND(IDT_ZOOMIN, OnZoomin)
ON_COMMAND(IDT_ZOOMOUT, OnZoomout)
ON_COMMAND(IDT_MOVING, OnMoving)
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_UPDATE_COMMAND_UI(ID_MENUITEM_LAYER1, OnUpdateMenuitemLayer1)
ON_UPDATE_COMMAND_UI(ID_MENUITEM_LAYER2, OnUpdateMenuitemLayer2)
ON_UPDATE_COMMAND_UI(ID_MENUITEM_LAYER3, OnUpdateMenuitemLayer3)
ON_UPDATE_COMMAND_UI(ID_MENUITEM_LAYER4, OnUpdateMenuitemLayer4)
ON_COMMAND(ID_MENUITEM_LAYER1, OnMenuitemLayer1)
ON_COMMAND(ID_MENUITEM_LAYER2, OnMenuitemLayer2)
ON_COMMAND(ID_MENUITEM_LAYER3, OnMenuitemLayer3)
ON_COMMAND(ID_MENUITEM_LAYER4, OnMenuitemLayer4)
ON_COMMAND(ID_FILE_CLOSE, OnFileClose)
ON_UPDATE_COMMAND_UI(IDT_MOVING, OnUpdateMoving)
ON_UPDATE_COMMAND_UI(IDT_ZOOMIN, OnUpdateZoomin)
ON_UPDATE_COMMAND_UI(IDT_ZOOMOUT, OnUpdateZoomout)
ON_UPDATE_COMMAND_UI(IDT_ARROW, OnUpdateArrow)
ON_COMMAND(IDT_ARROW, OnArrow)
ON_COMMAND(IDM_TEMPORARY, OnTemporary)
ON_WM_TIMER()
ON_UPDATE_COMMAND_UI(ID_MENUITEM_DYNA0, OnUpdateDyna0)
ON_UPDATE_COMMAND_UI(ID_MENUITEM_DYNA1, OnUpdateDyna1)
ON_UPDATE_COMMAND_UI(ID_MENUITEM_DYNA2, OnUpdateDyna2)
ON_UPDATE_COMMAND_UI(ID_MENUITEM_DYNA3, OnUpdateDyna3)
ON_COMMAND(ID_MENUITEM_DYNA0, OnDyna0)
ON_COMMAND(ID_MENUITEM_DYNA1, OnDyna1)
ON_COMMAND(ID_MENUITEM_DYNA2, OnDyna2)
ON_COMMAND(ID_MENUITEM_DYNA3, OnDyna3)
ON_UPDATE_COMMAND_UI(IDT_CALCULATE, OnUpdateCalculate)
ON_COMMAND(IDT_CALCULATE, OnCalculate)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDemo3View construction/destruction
void __stdcall TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwtime)
{
}
CDemo3View::CDemo3View()
{
// TODO: add construction code here
m_bMapMoving = false;
m_nMouseMode = -1;
}
CDemo3View::~CDemo3View()
{
}
BOOL CDemo3View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
//获得自定义光标资源
m_hcurHand = (HCURSOR)::LoadImage(cs.hInstance,
MAKEINTRESOURCE(IDC_CURSOR_HAND), IMAGE_CURSOR,
32, 32, LR_DEFAULTCOLOR);
m_hcurZoomIn = (HCURSOR)::LoadImage(cs.hInstance,
MAKEINTRESOURCE(IDC_CURSOR_ZOOMIN), IMAGE_CURSOR,
32, 32, LR_DEFAULTCOLOR);
m_hcurZoomOut = (HCURSOR)::LoadImage(cs.hInstance,
MAKEINTRESOURCE(IDC_CURSOR_ZOOMOUT), IMAGE_CURSOR,
32, 32, LR_DEFAULTCOLOR);
//获得光标资源
m_hcurArrow = AfxGetApp()->LoadCursor(IDC_CURSOR_ARROW);
m_hcurCross = AfxGetApp()->LoadCursor(IDC_CURSOR_CROSS);
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CDemo3View drawing
void CDemo3View::OnDraw(CDC* pDC)
{
CDemo3Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CDC* dc = GetDC();
dc->BitBlt(0, 0, pDoc->m_nViewWidth, pDoc->m_nVeiwHeight, pDoc->m_pMemDC,
0, 0, SRCCOPY);//刷新海图显示
pDoc->m_pShips->Draw(dc);//显示动态目标
ReleaseDC(dc);
}
/////////////////////////////////////////////////////////////////////////////
// CDemo3View printing
BOOL CDemo3View::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
pInfo->SetMinPage(1);
pInfo->SetMaxPage(1);//只打印一页
CDemo3Doc* pDoc = GetDocument();
if(!pDoc->m_aLayers.GetSize())
{//无打开海图
return false;
}
return DoPreparePrinting(pInfo);
}
void CDemo3View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CDemo3View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CDemo3View diagnostics
#ifdef _DEBUG
void CDemo3View::AssertValid() const
{
CView::AssertValid();
}
void CDemo3View::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CDemo3Doc* CDemo3View::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDemo3Doc)));
return (CDemo3Doc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDemo3View message handlers
void CDemo3View::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
CDC* pDC = GetDC();
CDemo3Doc* pDoc = GetDocument();
if(pDoc->m_pMemDC)
{
CDC dc;
dc.CreateCompatibleDC(pDC);//创建兼容DC
CBitmap *bitmap = new CBitmap;//重新创建BITMAP资源
bitmap->CreateCompatibleBitmap(pDC, cx, cy);
CBitmap* map = dc.SelectObject(bitmap);
dc.BitBlt(0, 0, cx, cy, NULL, 0, 0, WHITENESS);//清空BITMAP
dc.BitBlt(0, 0, cx, cy, pDoc->m_pMemDC, 0, 0, SRCCOPY);//复制
dc.SelectObject(map);//恢复DC
dc.DeleteDC();//删除DC
pDoc->m_pMemDC->SelectObject(bitmap);//选出原BITMAP
pDoc->m_pBitmap->DeleteObject();//删除BITMAP资源
delete pDoc->m_pBitmap;//删除BITMAP对象
pDoc->m_pBitmap = bitmap;
if(pDoc->m_nViewWidth<cx || pDoc->m_nVeiwHeight<cy)
{
pDoc->m_nViewWidth = cx;
pDoc->m_nVeiwHeight = cy;
//重绘位图
pDoc->DrawMap(pDoc->m_pMemDC);
Invalidate();
}
pDoc->m_nViewWidth = cx;
pDoc->m_nVeiwHeight = cy;
}
else
{
pDoc->m_pMemDC = new CDC;
pDoc->m_pMemDC->CreateCompatibleDC(pDC);//创建CD
pDoc->m_pBitmap = new CBitmap;
pDoc->m_pBitmap->CreateCompatibleBitmap(pDC, cx, cy);//创建BITMAP
pDoc->m_pDefaultBitmap = (CBitmap*)pDoc->m_pMemDC->SelectObject(pDoc->m_pBitmap);
pDoc->m_pMemDC->BitBlt(0, 0, cx, cy, NULL, 0, 0, WHITENESS);//清空BITMAP
pDoc->m_nViewWidth = cx;
pDoc->m_nVeiwHeight = cy;
}
}
void CDemo3View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
float jing, wei;
CDemo3Doc* pDoc = GetDocument();
if( !pDoc->m_aLayers.GetSize() )
{//未打开海图
return;
}
CRect client;
GetClientRect(&client);//获得客户区范围
ClientToScreen(&client);//转化为屏幕坐标
::ClipCursor(&client);//锁定鼠标移动范围
switch(m_nMouseMode)
{
case IDT_ZOOMOUT://缩小
pDoc->DPtoLP(point.x, point.y);
pDoc->ConvToJW(point.x, point.y, jing, wei);//计算鼠标点经纬度
pDoc->Zoom(0.625);//缩小海图
pDoc->ConvToXY(jing, wei, point.x, point.y);//计算缩小后的逻辑坐标
pDoc->SetCenter(point);
pDoc->DrawMap(pDoc->m_pMemDC);//重绘海图
Invalidate(false);//更新显示
break;
case IDT_ZOOMIN://放大
pDoc->DPtoLP(point.x, point.y);
pDoc->ConvToJW(point.x, point.y, jing, wei);//计算鼠标点经纬度
pDoc->Zoom(1.6);//放大海图
pDoc->ConvToXY(jing, wei, point.x, point.y);//计算放大后的逻辑坐标
pDoc->SetCenter(point);
pDoc->DrawMap(pDoc->m_pMemDC);//重绘海图
Invalidate(false);//更新显示
break;
case IDT_MOVING://漫游
m_ptOldPoint = point;//保存当前位置
m_bMapMoving = true;
pDoc->m_pShips->Draw(pDoc->m_pMemDC);//绘动态目标,以保证移动时屏幕的正确显示
break;
case IDT_ARROW:
CShip* ship;
if(ship = pDoc->m_pShips->PointAt(point))
{
::ClipCursor(NULL);//解除鼠标锁定
//创建无模式对话框
CShipInfo* dlg = new CShipInfo;
*dlg = ship;
dlg->Create(IDD_SHIPINFO, NULL);
dlg->ShowWindow(SW_SHOW);
}
break;
case IDT_CALCULATE:
m_ptOldPoint1 = m_ptOldPoint = point;//保存当前位置
m_bMapMoving = true;
break;
}
CView::OnLButtonDown(nFlags, point);
}
void CDemo3View::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
::ClipCursor(NULL);//解除鼠标锁定
CDemo3Doc* pDoc = GetDocument();
if( !pDoc->m_aLayers.GetSize() )
{//未打开海图
return;
}
switch(m_nMouseMode)
{
case IDT_MOVING:
m_bMapMoving = false;
pDoc->MoveOffset(point - m_ptOldPoint);
pDoc->DrawMap(pDoc->m_pMemDC);//重绘海图
Invalidate(false);//更新显示
break;
case IDT_CALCULATE:
CDC* pDC = GetDC();//申请DC
CPen pen( PS_SOLID, 1, 0xff );
CPen* oldpen = pDC->SelectObject(&pen);
pDC->MoveTo( m_ptOldPoint );
pDC->LineTo( m_ptOldPoint1 );
pDC->SelectObject(oldpen);
pen.DeleteObject();
ReleaseDC(pDC);//释放DC资源
//转换端点经纬度
float j1, w1, j2, w2;
double l, a;
pDoc->DPtoLP(m_ptOldPoint.x, m_ptOldPoint.y);
pDoc->ConvToJW(m_ptOldPoint.x, m_ptOldPoint.y, j1, w1);
pDoc->DPtoLP(m_ptOldPoint1.x, m_ptOldPoint1.y);
pDoc->ConvToJW(m_ptOldPoint1.x, m_ptOldPoint1.y, j2, w2);
//计算方位、距离
CMapProj proj;
proj.rhumb_line1(w1, j1, w2, j2, &a, &l);
//显示计算结果
CDisplayLen dlg;
dlg.m_strContent.Format("两点距离:%.2f 海里(%.2f公里)\n相对方位:%.1f度", l/1852, l/1000, a);
dlg.DoModal();
m_bMapMoving = false;
break;
}
CView::OnLButtonUp(nFlags, point);
}
void CDemo3View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDemo3Doc* pDoc = GetDocument();
if( !pDoc->m_aLayers.GetSize() )
{//未打开海图
return;
}
CDC* pDC = GetDC();//申请DC
if(m_nMouseMode != IDT_MOVING || !m_bMapMoving)
{//除漫游时外显示经纬度
pDoc->DisplayLocationOnStatusBar(point);//在状态条中显示经纬度
}
switch(m_nMouseMode)
{
case IDT_CALCULATE:
if(m_bMapMoving)
{
CPen pen( PS_SOLID, 1, 0xffff00 );
int oldrop = pDC->SetROP2( R2_XORPEN );
CPen* oldpen = pDC->SelectObject(&pen);
pDC->MoveTo( m_ptOldPoint );//删除原线
pDC->LineTo( m_ptOldPoint1 );
m_ptOldPoint1 = point;//更新端点
pDC->MoveTo( m_ptOldPoint );//绘新线
pDC->LineTo( m_ptOldPoint1 );
pDC->SelectObject(oldpen);
pDC->SetROP2(oldrop);
pen.DeleteObject();
}
break;
case IDT_MOVING:
if(m_bMapMoving)
{
CPoint pt = point - m_ptOldPoint;
//清空显示区其他区域
if(pt.x<0)
{//pt.x<0,图像左移,清空右侧
pDC->BitBlt(pDoc->m_nViewWidth + pt.x, 0, -pt.x, pDoc->m_nVeiwHeight,
NULL, 0, 0, WHITENESS);
}
else if(pt.x>0)
{//pt.x>0,图像右移,清空左侧
pDC->BitBlt(0, 0, pt.x, pDoc->m_nVeiwHeight,
NULL, 0, 0, WHITENESS);
}
if(pt.y<0)
{//pt.y<0,图像上移,清空下侧
pDC->BitBlt(0, pDoc->m_nVeiwHeight + pt.y, pDoc->m_nViewWidth, -pt.y,
NULL, 0, 0, WHITENESS);
}
else if(pt.y>0)
{//pt.y>0,图像下移,清空上侧
pDC->BitBlt(0, 0, pDoc->m_nViewWidth, pt.y,
NULL, 0, 0, WHITENESS);
}
pDC->BitBlt(pt.x, pt.y, pDoc->m_nViewWidth, pDoc->m_nVeiwHeight,
pDoc->m_pMemDC, 0, 0, SRCCOPY);//复制图像(BITMAP)
}
break;
}
ReleaseDC(pDC);//释放DC资源
CView::OnMouseMove(nFlags, point);
}
void CDemo3View::OnZoomin()
{
// TODO: Add your command handler code here
::SetClassLong(GetSafeHwnd(), GCL_HCURSOR, (LONG)m_hcurZoomIn);
m_nMouseMode = IDT_ZOOMIN;
}
void CDemo3View::OnZoomout()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -