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

📄 demo3view.cpp

📁 Viaual C++实战演练一书的源代码,对于C++程序员有实际的借鉴意义.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -