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