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

📄 imageview.cpp

📁 Visual C++_ 600 编程学习捷径
💻 CPP
字号:
// ImageView.cpp : implementation of the CImageView class
//

#include "stdafx.h"
#include "ImageTest.h"

#include "ImageDoc.h"
#include "ImageView.h"
#include "mainfrm.h"
#include "ImageStandard.h"
#include <math.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CImageView

IMPLEMENT_DYNCREATE(CImageView, CView)

BEGIN_MESSAGE_MAP(CImageView, CView)
	//{{AFX_MSG_MAP(CImageView)
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
	ON_WM_CREATE()
	ON_WM_MOUSEMOVE()
	ON_WM_SIZE()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_COMMAND(ID_EDIT_SELECT, OnEditSelect)
	ON_UPDATE_COMMAND_UI(ID_EDIT_SELECT, OnUpdateEditSelect)
	ON_COMMAND(ID_EDIT_ZOOMIN, OnEditZoomin)
	ON_UPDATE_COMMAND_UI(ID_EDIT_ZOOMIN, OnUpdateEditZoomin)
	ON_COMMAND(ID_EDIT_ZOOMOUT, OnEditZoomout)
	ON_UPDATE_COMMAND_UI(ID_EDIT_ZOOMOUT, OnUpdateEditZoomout)
	ON_COMMAND(ID_EDIT_MOVE, OnEditMove)
	ON_UPDATE_COMMAND_UI(ID_EDIT_MOVE, OnUpdateEditMove)
	ON_COMMAND(ID_EDIT_ZOOMALL, OnEditZoomall)
	ON_WM_SETCURSOR()
	ON_WM_KEYDOWN()
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CImageView construction/destruction

CImageView::CImageView()
{
	m_nCurrentTool = MAP_TOOL_ARROW;
	m_bIsLButtonDown = FALSE;


	m_hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
}

CImageView::~CImageView()
{
}

BOOL CImageView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

int CImageView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	return 0;
}

void CImageView::OnInitialUpdate() 
{
	CView::OnInitialUpdate();
	
	m_map.SetMapHwnd(m_hWnd);
	CRect rc;
	GetClientRect(&rc);
	m_map.SetClientRect(&rc);
}

/////////////////////////////////////////////////////////////////////////////
// CImageView drawing

void CImageView::OnDraw(CDC* pDC)
{
	CRect rc;
	GetClientRect(&rc);
	m_map.Draw(pDC, rc);
}

/////////////////////////////////////////////////////////////////////////////
// CImageView printing

BOOL CImageView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CImageView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CImageView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CImageView diagnostics

#ifdef _DEBUG
void CImageView::AssertValid() const
{
	CView::AssertValid();
}

void CImageView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CImageDoc* CImageView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CImageDoc)));
	return (CImageDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CImageView message handlers

void CImageView::OnFileOpen() 
{
	CFileDialog dlg(TRUE, "bmp", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
		"bmp文件(*.bmp)|*.bmp||", this);
	if(dlg.DoModal() == IDOK)
	{
		CString path = dlg.GetPathName();
		m_map.LoadMapFile(path);
		int id = path.ReverseFind('\\');
		CString title = path.Right(path.GetLength() - id - 1);
		id = title.Find('.');
		title = title.Left(id);
		if(!m_map.IsSetMapMBRC())
		{
			CImageStandard ImageStand;
			if(ImageStand.DoModal() == IDOK)
			{
				m_map.SetMapMBRC(ImageStand.m_dX1, ImageStand.m_dY1, 
					ImageStand.m_dX2, ImageStand.m_dY2, ImageStand.m_dScale);
			}
			else
			{
				m_map.UnloadMap();
				return;
			}
		}
		m_map.DrawMap();
		AfxGetApp()->GetMainWnd()->SetWindowText(title);
	}
}

void CImageView::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);
	
	m_map.SetClientRect(0, 0, cx, cy); 
	UpdateWindow();
}

void CImageView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	if(m_nCurrentTool == MAP_TOOL_ARROW    || 
	   m_nCurrentTool == MAP_TOOL_MOVE     ||
	   m_nCurrentTool == MAP_TOOL_ZOOM_IN  ||
	   m_nCurrentTool == MAP_TOOL_ZOOM_OUT )
	{
		m_bIsLButtonDown = TRUE;
		m_OrgPoint = point;
		m_OldPoint = point;

		SetCapture();

		/*拖动时把鼠标限制在地图窗口内*/
		CRect rc;
		GetClientRect(&rc);
		ClientToScreen(&rc);
		::ClipCursor(&rc);
	}
	
	CView::OnLButtonDown(nFlags, point);
}

void CImageView::OnMouseMove(UINT nFlags, CPoint point) 
{
	if(m_bIsLButtonDown)
	{
		if(m_nCurrentTool != MAP_TOOL_MOVE)
		{
			CDC *pdc = GetDC();
			CRect rect(m_OrgPoint.x, m_OrgPoint.y, m_OldPoint.x, m_OldPoint.y);
			if(m_bIsLButtonDown == 2)
			{
				rect.NormalizeRect();
				pdc->DrawFocusRect(&rect);
			}
			else 
				m_bIsLButtonDown = 2;
			rect.SetRect(m_OrgPoint.x,m_OrgPoint.y,point.x,point.y);
			rect.NormalizeRect();
			pdc->DrawFocusRect(&rect);
			m_OldPoint = point;
			ReleaseDC(pdc);
		}
		else
		{
			m_map.MoveMap(point.x - m_OrgPoint.x, point.y - m_OrgPoint.y, FALSE);
		}
	}

	CString text;
	double x = point.x;
	double y = point.y;
	m_map.ScreenToMap(&x, &y);
	text.Format("经度:%.5f, 纬度:%.5f", fabs(x), fabs(y));

	((CMainFrame *)AfxGetMainWnd())->SetStatusText(text);
	
	CView::OnMouseMove(nFlags, point);
}

void CImageView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	if(m_bIsLButtonDown)
	{
		if(m_nCurrentTool != MAP_TOOL_MOVE && m_bIsLButtonDown == 2)
		{
			CDC *pdc = GetDC();
			CRect rect(m_OrgPoint.x, m_OrgPoint.y, m_OldPoint.x, m_OldPoint.y);
			rect.NormalizeRect();
			pdc->DrawFocusRect(&rect);
			ReleaseDC(pdc);
		}
		::ReleaseCapture();
		::ClipCursor(NULL);
		m_bIsLButtonDown = FALSE;
	}

	switch(m_nCurrentTool)
	{
	case MAP_TOOL_ARROW:      //箭头
		break;
	case MAP_TOOL_MOVE:       //漫游
		if(point == m_OrgPoint) break;
		m_map.MoveMap(point.x - m_OrgPoint.x, point.y - m_OrgPoint.y);
		break;
	case MAP_TOOL_ZOOM_IN:    //放大
		if(m_OrgPoint.x == point.x || m_OrgPoint.y == point.y)
			m_map.ZoomIn(point.x, point.y);
		else 
			m_map.ZoomIn(m_OrgPoint, point);
		break;
	case MAP_TOOL_ZOOM_OUT:   //缩小
		if(m_OrgPoint.x == point.x || m_OrgPoint.y == point.y)
			m_map.ZoomOut(point.x, point.y);
		else 
			m_map.ZoomOut(m_OrgPoint, point);
		break;
	default: break;
	}

	CView::OnLButtonUp(nFlags, point);
}

void CImageView::OnEditSelect() 
{
	m_nCurrentTool = MAP_TOOL_ARROW;

	m_hCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
	::SetCursor(m_hCursor);
}

void CImageView::OnUpdateEditSelect(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(m_nCurrentTool == MAP_TOOL_ARROW);	
}

void CImageView::OnEditZoomin() 
{
	m_nCurrentTool = MAP_TOOL_ZOOM_IN;

	m_hCursor = AfxGetApp()->LoadCursor(IDC_CURSOR_ZOOMIN);
	::SetCursor(m_hCursor);
}

void CImageView::OnUpdateEditZoomin(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(m_nCurrentTool == MAP_TOOL_ZOOM_IN);	
}

void CImageView::OnEditZoomout() 
{
	m_nCurrentTool = MAP_TOOL_ZOOM_OUT;

	m_hCursor = AfxGetApp()->LoadCursor(IDC_CURSOR_ZOOMOUT);
	::SetCursor(m_hCursor);
}

void CImageView::OnUpdateEditZoomout(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(m_nCurrentTool == MAP_TOOL_ZOOM_OUT);	
}

void CImageView::OnEditMove() 
{
	m_nCurrentTool = MAP_TOOL_MOVE;

	m_hCursor = AfxGetApp()->LoadCursor(IDC_CURSOR_MOVE);
	::SetCursor(m_hCursor);
}

void CImageView::OnUpdateEditMove(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(m_nCurrentTool == MAP_TOOL_MOVE);	
}

void CImageView::OnEditZoomall() 
{
	m_map.ZoomToAll();
}

BOOL CImageView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
	::SetCursor(m_hCursor);
	
	return TRUE;
//	return CView::OnSetCursor(pWnd, nHitTest, message);
}

void CImageView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	switch(nChar)
	{
	case VK_LEFT:  //左移
		m_map.MoveLeft();
		break;
	case VK_RIGHT: //右移
		m_map.MoveRight();
		break;
	case VK_UP:    //上移
		m_map.MoveUp();
		break;
	case VK_DOWN:  //下移
		m_map.MoveDown();
		break;
	default: break;
	}

	CView::OnKeyDown(nChar, nRepCnt, nFlags);
}

⌨️ 快捷键说明

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