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

📄 skyblue_pintuview.cpp

📁 包含拼图小游戏的详细程序代码 有兴趣的可以看看
💻 CPP
字号:
/*++

Copyright (c) AFE(Active-Free-Elegance)

Module Name:

    skyblue_PinTuView.cpp

Abstract:

	View , manage drawing 

Author:

    Weijian Luo (Arthur Luo)   15-Jun-2005

	E-mail: skybluehacker@yahoo.com.cn

Revision History:      1.0

--*/

#include "stdafx.h"
#include "skyblue_PinTu.h"

#include "skyblue_PinTuDoc.h"
#include "skyblue_PinTuView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CSkyblue_PinTuView

IMPLEMENT_DYNCREATE(CSkyblue_PinTuView, CView)

BEGIN_MESSAGE_MAP(CSkyblue_PinTuView, CView)
	//{{AFX_MSG_MAP(CSkyblue_PinTuView)
	ON_WM_LBUTTONDOWN()
	ON_WM_KEYDOWN()
	ON_WM_SHOWWINDOW()
	ON_WM_SETFOCUS()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSkyblue_PinTuView construction/destruction

CSkyblue_PinTuView::CSkyblue_PinTuView()
{
	// TODO: add construction code here
m_bFirstRun = TRUE;
}

CSkyblue_PinTuView::~CSkyblue_PinTuView()
{
}

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


	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CSkyblue_PinTuView drawing

void CSkyblue_PinTuView::OnDraw(CDC* pDC)
{
	//a.获取文档数据控制权
	CSkyblue_PinTuDoc* pDoc = (CSkyblue_PinTuDoc*)GetDocument();

	//b.使用内存设备环境memDC
	//  与内存环境关联的内存位图memBmp
	CDC memDC;
	memDC.CreateCompatibleDC(pDC);
	CBitmap memBmp;
	memBmp.CreateCompatibleBitmap(pDC,
		pDoc->m_bmpWidth,pDoc->m_bmpHeight);
	memDC.SelectObject(&memBmp);

	//c. 将图像绘制到内存位图memBmp中

	//1.绘制游戏所有当前散乱的方块
	DrawGameBlocks(&memDC);
	//2.绘制空白方块
	DrawBlankBlock(&memDC);
	//3.绘制边界间隔线条
	DrawLines(&memDC);

	//d.整幅图从内存memBmp拷贝到屏幕
	pDC->BitBlt(0,0,pDoc->m_bmpWidth,pDoc->m_bmpHeight,
				&memDC,0,0,SRCCOPY);
}

/////////////////////////////////////////////////////////////////////////////
// CSkyblue_PinTuView diagnostics

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

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

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CSkyblue_PinTuView message handlers

//
//  绘制方块间的边界线
//
void CSkyblue_PinTuView::DrawLines(CDC *pDC)
{
	//创建并设定铅笔的样式
	CPen linePen;
	linePen.CreatePen(PS_SOLID, 3, RGB(255,0,0));	
	CPen *pOldPen = pDC->SelectObject(&linePen);

	//获取文档核心数据访问权
	CSkyblue_PinTuDoc* pDoc = (CSkyblue_PinTuDoc*)GetDocument();
	
	int i;
	//竖向线绘制
	for(i=1;i<pDoc->hnums;i++)
	{
		pDC->MoveTo(i*pDoc->m_cellWidth-1,0);
		pDC->LineTo(i*pDoc->m_cellWidth-1,pDoc->m_bmpHeight);
	}
	
	//横向线绘制
	for(i=1;i<pDoc->vnums;i++)
	{
		pDC->MoveTo(0,i*pDoc->m_cellHeight-1);
		pDC->LineTo(pDoc->m_bmpWidth,i*pDoc->m_cellHeight-1);
	}
	
	//设备恢复
	pDC->SelectObject(pOldPen);
}

//
//  绘制空白方块
//
void CSkyblue_PinTuView::DrawBlankBlock(CDC *pDC)
{
	//获取文档核心数据访问权
	CSkyblue_PinTuDoc* pDoc = (CSkyblue_PinTuDoc*)GetDocument();

	//计算出矩形区域位置
	RECT rc;
	rc.left =(pDoc->m_blankPos.row-1)*pDoc->m_cellWidth;
	rc.top =(pDoc->m_blankPos.col -1)*pDoc->m_cellHeight;
	rc.right=rc.left +pDoc->m_cellWidth;
	rc.bottom =rc.top +pDoc->m_cellHeight;

	//矩形区域填充
	pDC->FillSolidRect(&rc,RGB(153,153,153));
}

//
//  绘制某cell单元方块
//
void CSkyblue_PinTuView::DrawCellBlock(CDC *pDC, pos destPos, pos srcPos)
{
	//获取文档核心数据访问权
	CSkyblue_PinTuDoc* pDoc = (CSkyblue_PinTuDoc*)GetDocument();

	//使用内存DC,宣布与当前位图关联
	//以便为下面提供拷贝的数据源(位图)
	CDC memdc;
	memdc.CreateCompatibleDC(pDC);
	memdc.SelectObject(pDoc->m_bitmap);
	
	//根据源方块的位置和目标放开位置(当前方块实际位置)
	//进行拷贝
	pDC->BitBlt((destPos.row-1)*pDoc->m_cellWidth,
		(destPos.col-1)*pDoc->m_cellHeight,
		pDoc->m_cellWidth,pDoc->m_cellHeight,&memdc,
		(srcPos.row-1)*pDoc->m_cellWidth,
		(srcPos.col-1)*pDoc->m_cellHeight,SRCCOPY);
}

//
//  绘制游戏所有当前散乱的方块
//
void CSkyblue_PinTuView::DrawGameBlocks(CDC *pDC)
{
	//获取文档核心数据访问权
	CSkyblue_PinTuDoc* pDoc = (CSkyblue_PinTuDoc*)GetDocument();

	int i;
	int j;
	pos destPos; //目标位置
	pos srcPos;	 //图像在源位图的位置

	//将所有方块逐个拷贝
	for(i = 1;i<=pDoc->hnums;i++)
	{
		for(j = 1;j<=pDoc->vnums;j++)
		{
			srcPos.row = pDoc->m_map[i][j].row;
			srcPos.col = pDoc->m_map[i][j].col;
			destPos.row = i;
			destPos.col = j;
			DrawCellBlock(pDC,destPos, srcPos);
		}
	}
}

//
//  处理键盘消息
//
void CSkyblue_PinTuView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	//响应视图区域的键盘事件,然后交给文档作数据运算处理
	CSkyblue_PinTuDoc* pDoc = (CSkyblue_PinTuDoc*)GetDocument();
	pDoc->OnKeyDown(nChar,nRepCnt,nFlags);

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

//
//  处理鼠标左键消息
//
void CSkyblue_PinTuView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	CSkyblue_PinTuDoc* pDoc = (CSkyblue_PinTuDoc*)GetDocument();

	//计算出鼠标点击所在的cell方块位置
	pos DownPos;
	DownPos.row =point.x/pDoc->m_cellWidth+1;
	DownPos.col =point.y/pDoc->m_cellHeight+1;

	//根据当前空白方块位置将鼠标点击其相邻方块的情况
	//转换成键盘输入提交给文档document作数据运算处理
	if(abs(DownPos.row-pDoc->m_blankPos.row)+abs(DownPos.col-pDoc->m_blankPos.col)==1)
	{
		if(DownPos.row - pDoc->m_blankPos.row == 1)
		{
			pDoc->OnKeyDown(VK_RIGHT,0,0);
		}
        if(DownPos.row - pDoc->m_blankPos.row == -1)
		{
			pDoc->OnKeyDown(VK_LEFT,0,0);
		}
		if(DownPos.col - pDoc->m_blankPos.col == 1)
		{
			pDoc->OnKeyDown(VK_DOWN,0,0);
		}
		if(DownPos.col - pDoc->m_blankPos.col == -1)
		{
			pDoc->OnKeyDown(VK_UP,0,0);
		}
	}
}

//响应Document的UpdateAllViews()
void CSkyblue_PinTuView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
{
	Invalidate(FALSE);	
}

void CSkyblue_PinTuView::OnShowWindow(BOOL bShow, UINT nStatus) 
{
	CView::OnShowWindow(bShow, nStatus);
	/*
	if(m_bFirstRun)
	{
		m_bFirstRun = FALSE;
	//获取文档核心数据访问权
	CSkyblue_PinTuDoc* pDoc = (CSkyblue_PinTuDoc*)GetDocument();
	pDoc->OnNewgame();
	}
	*/
}

void CSkyblue_PinTuView::OnSetFocus(CWnd* pOldWnd) 
{
	CView::OnSetFocus(pOldWnd);
	
	// TODO: Add your message handler code here
	
}

⌨️ 快捷键说明

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