📄 mapeditdlg.cpp
字号:
// MapEditDlg.cpp : implementation file
//
#include "stdafx.h"
#include "45MapMaker.h"
#include "MapEditDlg.h"
#include "MainFrm.h"
#include "45MapMakerView.h"
#include ".\mapeditdlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMapEditDlg dialog
IMPLEMENT_DYNCREATE(CMapEditDlg, CDialog)
CMapEditDlg::CMapEditDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMapEditDlg::IDD, pParent)
{
littlemapw = littlemaph = 150;
viewx = viewy =0;
keyDown = false;
//{{AFX_DATA_INIT(CMapEditDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CMapEditDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMapEditDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
DDX_Control(pDX, IDC_LITTLEMAP, m_littlemap);
}
BEGIN_MESSAGE_MAP(CMapEditDlg, CDialog)
//{{AFX_MSG_MAP(CMapEditDlg)
// NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
ON_WM_SIZE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_PAINT()
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMapEditDlg message handlers
void CMapEditDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
CRect rt;
if(m_littlemap)
{
m_littlemap.SetWindowPos(&wndTop,(cx-littlemapw)/2,10,littlemapw,littlemaph,SWP_SHOWWINDOW);
}
}
void CMapEditDlg::DrawLittleMap()
{
CMainFrame *pMain=(CMainFrame *)AfxGetApp()->m_pMainWnd;
CMy45MapMakerView *pView=(CMy45MapMakerView *)pMain->GetActiveView();//取得view的指针
//viewx viewy littlemapw littlemaph
//计算beginx,beginy;
CRect rt;
pView->GetClientRect(&rt);
int viewwidth = ((rt.Width())/(pView->tileWidth/2));
if((rt.Width()%(pView->tileWidth/2)))
viewwidth++;
int viewheight = ((rt.Height())/(pView->tileHeight));
if((rt.Height()%(pView->tileHeight/2)))
viewheight++;
//求得view的大小
if(keyDown)
{
pView->mapBeginx = viewx*pView->mapWidth/littlemapw;
pView->mapBeginy = viewy*pView->mapHeight/littlemaph;
pView->mapBeginx = pView->mapBeginx-viewwidth/2;
if(pView->mapBeginx<0)
pView->mapBeginx=0;
if((pView->mapBeginx+viewwidth)>pView->mapWidth)
pView->mapBeginx = pView->mapWidth - viewwidth;
pView->mapBeginy = pView->mapBeginy-viewheight/2;
if(pView->mapBeginy<0)
pView->mapBeginy = 0;
if((pView->mapBeginy+viewheight)>pView->mapHeight)
pView->mapBeginy = pView->mapHeight - viewheight;
}
//计算pView的begin点值
HDC hdc = m_littlemap.GetDC()->m_hDC; //dc
m_littlemap.GetClientRect(&rt); //rt
HDC memDC = ::CreateCompatibleDC(hdc);
HBITMAP memBitmap = ::CreateCompatibleBitmap(hdc,rt.Width(),rt.Height());
::SelectObject(memDC,memBitmap);
HPEN pen = (HPEN)CreatePen(PS_SOLID,1,RGB(255,255,255)); //白色画笔
HBRUSH brush = ::CreateSolidBrush(RGB(64,64,255)); //深蓝画刷
HBRUSH brush1 = ::CreateSolidBrush(RGB(0,0,0)); //黑色画刷
::SelectObject(memDC,brush);
::Rectangle(memDC,0,0,rt.Width(),rt.Height()); //用深蓝色填充背景
CRect rs;
if(pView->mapWidth>=pView->mapHeight)
{
rs.left = 0;
rs.right = rt.Width();
rs.top =(rt.Height()-(rt.Width()*pView->mapHeight/pView->mapWidth))/2;
rs.bottom = rt.Height() - rs.top;
}
else
{
rs.top = 0;
rs.bottom = rt.Height();
rs.left = (rt.Width()-(rt.Height()*pView->mapWidth/pView->mapHeight))/2;
rs.right = rt.Width() - rs.left;
}
::SelectObject(memDC,brush1);
::Rectangle(memDC,rs.left,rs.top,rs.right,rs.bottom);
::SelectObject(memDC,pen);
::MoveToEx(memDC,rs.left-1,rs.top-1,NULL);
::LineTo(memDC,rs.right+1,rs.top-1);
::LineTo(memDC,rs.right+1,rs.bottom+1);
::LineTo(memDC,rs.left-1,rs.bottom+1);
::LineTo(memDC,rs.left-1,rs.top-1);
//画小地图预览
CRect rp;
rp.left = pView->mapBeginx*rs.Width()/pView->mapWidth;
rp.top = pView->mapBeginy*rs.Height()/pView->mapHeight;
rp.right = (pView->mapBeginx+viewwidth)*rs.Width()/pView->mapWidth;
rp.bottom = (pView->mapBeginy+viewheight)*rs.Height()/pView->mapHeight;
::SelectObject(memDC,brush);
::Rectangle(memDC,rp.left,rp.top,rp.right,rp.bottom);
/*::MoveToEx(memDC,rp.left,rp.top,NULL);
::LineTo(memDC,rp.right,rp.top);
::LineTo(memDC,rp.right,rp.bottom);
::LineTo(memDC,rp.left,rp.bottom);
::LineTo(memDC,rp.left,rp.top);*/
::BitBlt(hdc,0,0,rt.Width(),rt.Height(),memDC,0,0,SRCCOPY);
::DeleteObject(brush1);
::DeleteObject(brush);
::DeleteObject(pen);
::DeleteObject(memBitmap);
::DeleteObject(memDC);
pView->Invalidate();
}
void CMapEditDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
keyDown =true;
CDialog::OnLButtonDown(nFlags, point);
}
void CMapEditDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
keyDown = false;
CDialog::OnLButtonUp(nFlags, point);
}
void CMapEditDlg::OnMouseMove(UINT nFlags, CPoint point)
{
if(keyDown)
{
CRect rt;
CRect rs;
m_littlemap.GetWindowRect(&rt);
this->GetWindowRect(&rs);
viewx = point.x - rt.left + rs.left;
viewy = point.y - rt.top + rs.top;
if(viewx<0)
viewx =0;
if(viewx>littlemapw)
viewx = littlemapw;
if(viewy<0)
viewy = 0;
if(viewy>littlemaph)
viewy = littlemaph;
DrawLittleMap();
}
CDialog::OnMouseMove(nFlags, point);
}
void CMapEditDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CDialog::OnPaint()
DrawLittleMap();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -