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

📄 mapeditdlg.cpp

📁 一款45度2D游戏地图编辑器和大家一起分享啊!
💻 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 + -