// SnakeView.cpp : implementation of the CSnakeView class
//
#include "stdafx.h"
#include "Snake.h"
#include "MainFrm.h"
#include "SnakeDoc.h"
#include "SnakeView.h"
#include "ScoreBoardDlg.h"
#include "ChangeSpeedDlg.h"
#include <mmsystem.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define IDT_TIMER 1000
/////////////////////////////////////////////////////////////////////////////
// CSnakeView
IMPLEMENT_DYNCREATE(CSnakeView, CView)
BEGIN_MESSAGE_MAP(CSnakeView, CView)
//{{AFX_MSG_MAP(CSnakeView)
ON_WM_SIZE()
ON_WM_PAINT()
ON_WM_CONTEXTMENU()
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_TIMER()
ON_WM_KEYDOWN()
ON_WM_CLOSE()
ON_COMMAND(IDM_CHANGELEVEL, OnChangeLevel)
//}}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()
/////////////////////////////////////////////////////////////////////////////
// CSnakeView construction/destruction
CSnakeView::CSnakeView()
: m_pDCMemDB(0),
m_pBmpDB(0),
m_pActionHandler(0),
m_numCellsX(10),
m_numCellsY(10),
m_timerID(0)
{
}
CSnakeView::~CSnakeView()
{
if (m_pDCMemDB)
delete m_pDCMemDB;
if (m_pBmpDB)
delete m_pBmpDB;
if (m_pActionHandler)
delete m_pActionHandler;
}
BOOL CSnakeView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CSnakeView drawing
void CSnakeView::OnDraw(CDC* pDC)
{
CSnakeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
m_pDC = pDC;
CRect rect;
GetClientRect(&rect);
// draw boundary
CBitmap bmpBrick;
bmpBrick.LoadBitmap(IDB_BRICK);
CBrush brBrick;
brBrick.CreatePatternBrush(&bmpBrick);
CBrush *pBrOld = pDC->SelectObject(&brBrick);
pDC->PatBlt(rect.left, rect.top,
rect.Width(), rect.Height(),
PATCOPY);
pDC->SelectObject(pBrOld);
// draw interior field
CBitmap bmpCell;
bmpCell.LoadBitmap(IDB_CELL);
CBrush brCell;
brCell.CreatePatternBrush(&bmpCell);
pBrOld = pDC->SelectObject(&brCell);
pDC->PatBlt(rect.left+32, rect.top+32+32,
rect.Width()-64, rect.Height()-64-32,
PATCOPY);
pDC->SelectObject(pBrOld);
// draw scoreboard
drawSprite(pDC, IDB_SCOREBOARD,
(int)((m_numCellsX-9)/2.0+1)*32, 5);
pDC->SetBkMode(TRANSPARENT);
pDC->TextOut((int)((m_numCellsX-9)/2.0+2)*32, 16,
"Scores:");
// draw all game components
if (m_pActionHandler)
m_pActionHandler->draw();
m_pDC = 0;
}
/////////////////////////////////////////////////////////////////////////////
// CSnakeView printing
BOOL CSnakeView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CSnakeView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CSnakeView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CSnakeView diagnostics
#ifdef _DEBUG
void CSnakeView::AssertValid() const
{
CView::AssertValid();
}
void CSnakeView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CSnakeDoc* CSnakeView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSnakeDoc)));
return (CSnakeDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CSnakeView message handlers
void CSnakeView::OnInitialUpdate()
{
CView::OnInitialUpdate();
CClientDC dcClient(this);
OnPrepareDC(&dcClient);
m_pDCMemDB = new CDC;
m_pDCMemDB->CreateCompatibleDC(&dcClient);
m_pDCMemDB->SetMapMode(dcClient.GetMapMode());
}
void CSnakeView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
CRect rect;
GetClientRect(&rect); // device coordinates
// API without DC as arguments,
// always use device coordinates
if ((rect.right <= m_sizeDB.cx) &&
(rect.bottom <= m_sizeDB.cy)) return;
if (rect.right > m_sizeDB.cx)
m_sizeDB.cx = rect.right;
if (rect.bottom > m_sizeDB.cy)
m_sizeDB.cy = rect.bottom;
CClientDC dcClient(this);
OnPrepareDC(&dcClient); // order dependency: after adjustScrollSizes()
if (m_pBmpDB) delete m_pBmpDB;
m_pBmpDB = new CBitmap;
m_pBmpDB->CreateCompatibleBitmap(&dcClient, m_sizeDB.cx, m_sizeDB.cy);
}
void CSnakeView::OnPaint()
{
CPaintDC dc(this); // device context for painting
OnPrepareDC(&dc);
CBitmap *pBmpOld = m_pDCMemDB->SelectObject(m_pBmpDB);
CRect rectInvalid;
dc.GetClipBox(&rectInvalid); // logical coordinate
m_pDCMemDB->SelectClipRgn(NULL);
m_pDCMemDB->IntersectClipRect(&rectInvalid);
/*
CBrush brBackground((COLORREF)::GetSysColor(COLOR_WINDOW));
CBrush *pBrOld = m_pDCMemDB->SelectObject(&brBackground);
m_pDCMemDB->PatBlt(rectInvalid.left, rectInvalid.top,
rectInvalid.Width(), rectInvalid.Height(),
PATCOPY);
m_pDCMemDB->SelectObject(pBrOld);
*/
OnDraw(m_pDCMemDB);
dc.BitBlt(rectInvalid.left, rectInvalid.top,
rectInvalid.Width(), rectInvalid.Height(),
m_pDCMemDB, // MM_TEXT mode
rectInvalid.left, rectInvalid.top,
SRCCOPY);
m_pDCMemDB->SelectObject(pBmpOld);
}
void CSnakeView::drawSprite(CDC *pDC, int resID,
int ix, int iy)
{
BITMAP bmpInfo;
CSize sizeBmp;
CDC dcMem1, dcMem2;
dcMem1.CreateCompatibleDC(pDC);
dcMem2.CreateCompatibleDC(pDC);
// Step 1
// create mask step 1: XOR the specified color
CBitmap bmpSprite;
bmpSprite.LoadBitmap(resID);
bmpSprite.GetBitmap(&bmpInfo);
sizeBmp = CSize(bmpInfo.bmWidth, bmpInfo.bmHeight);
CBitmap bmpMask1;
bmpMask1.CreateCompatibleBitmap(pDC, bmpInfo.bmWidth, bmpInfo.bmHeight);
CBitmap *pOldBmp1 = (CBitmap *)dcMem1.SelectObject(&bmpMask1);
CPen *pPen = (CPen *) dcMem1.SelectStockObject(NULL_PEN);
CBrush br(RGB(131,0,0));
CBrush *pBr = (CBrush *)dcMem1.SelectObject(&br);
dcMem1.Rectangle(0,0,bmpInfo.bmWidth+1, bmpInfo.bmHeight+1);
dcMem1.SelectObject(pBr);
dcMem1.SelectObject(pPen);
CBitmap *pOldBmp2 = (CBitmap *)dcMem2.SelectObject(&bmpSprite);
// transparent color will now be black
dcMem1.SetMapMode(MM_TEXT); dcMem2.SetMapMode(MM_TEXT);
dcMem1.BitBlt(0, 0,
bmpInfo.bmWidth, bmpInfo.bmHeight,
&dcMem2,
0, 0, SRCINVERT);
dcMem1.SelectObject(pOldBmp1);
dcMem2.SelectObject(pOldBmp2);
// Step 2
// create mask step 2: make transparent color region white
CBitmap bmpMask2;
bmpMask2.CreateCompatibleBitmap(pDC, bmpInfo.bmWidth, bmpInfo.bmHeight);
pOldBmp2 = (CBitmap *)dcMem2.SelectObject(&bmpMask2);
pOldBmp1 = (CBitmap *)dcMem1.SelectObject(&bmpMask1);
dcMem1.SetMapMode(MM_TEXT); dcMem2.SetMapMode(MM_TEXT);
dcMem2.BitBlt(0, 0,
bmpInfo.bmWidth, bmpInfo.bmHeight,
&dcMem1,
0, 0, NOTSRCCOPY);
dcMem1.SelectObject(pOldBmp1);
dcMem2.Selec
没有合适的资源?快使用搜索试试~ 我知道了~
商业编程-源码-贪吃蛇源代码MFC.zip
共50个文件
bmp:16个
h:14个
cpp:11个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 62 浏览量
2022-06-23
16:07:36
上传
评论
收藏 75KB ZIP 举报
温馨提示
商业编程-源码-贪吃蛇源代码MFC.zip
资源推荐
资源详情
资源评论
收起资源包目录
商业编程-源码-贪吃蛇源代码MFC.zip (50个子文件)
贪吃蛇源代码MFC
SnakeMfc
AboutDlg.h 1KB
w95trace1.h 2KB
w95trace1.cpp 17KB
Snake.cpp 3KB
Snake.opt 54KB
AboutDlg.cpp 839B
res
scoreboard.BMP 15KB
head_right_open.bmp 2KB
head_right_close.bmp 2KB
head_up_close.bmp 2KB
head_down_open.bmp 2KB
head_left_open.bmp 2KB
head_up_open.bmp 2KB
Toolbar.bmp 1KB
Snake.ico 1KB
SnakeDoc.ico 1KB
body.bmp 2KB
cell.bmp 2KB
head_down_close.bmp 2KB
head_left_close.bmp 2KB
flower.bmp 2KB
brick.bmp 1KB
cell_green.bmp 2KB
Snake.rc2 397B
fruit.bmp 2KB
Snake.dsp 6KB
ChangeSpeedDlg.cpp 1KB
ScoreBoardDlg.cpp 1KB
IActionHandler.h 1KB
Snake.clw 3KB
IGraphicOut.h 1KB
Snake.h 1KB
Snake.rc 13KB
SnakeView.cpp 18KB
ChangeSpeedDlg.h 1KB
Snake.dsw 533B
StdAfx.cpp 207B
MainFrm.cpp 5KB
resource.h 1KB
main.cpp 401B
SnakeDoc.cpp 2KB
MainFrm.h 2KB
main.h 60B
SnakeDoc.h 1KB
StdAfx.h 1KB
SnakeGame.cpp 4KB
ScoreBoardDlg.h 1KB
Debug
Snake.exe 204KB
SnakeView.h 3KB
SnakeGame.h 1KB
共 50 条
- 1
资源评论
programxh
- 粉丝: 17
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功