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

📄 canvasframe.cpp

📁 《Visual C++游戏设计入门》配套代码
💻 CPP
字号:
// canvasFrame.cpp : implementation file
//

#include "stdafx.h"
#include "canvasr.h"
#include "canvasFrame.h"

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

/////////////////////////////////////////////////////////////////////////////
// canvasFrame

IMPLEMENT_DYNCREATE(canvasFrame, CFrameWnd)
int i,b,g,r;
canvasFrame::canvasFrame()
{
	Create(NULL,"绘图窗口",WS_OVERLAPPEDWINDOW,CRect(0,0,640,480));
	CClientDC dc(this);
	int width = dc.GetDeviceCaps(HORZRES);
	int height = dc.GetDeviceCaps(VERTRES);
	GetWindowRect( &rect );
	width = ( width - ( rect.right - rect.left ))/2 ;
	height = (height - (rect.bottom - rect.top ))/2 ;
	MoveWindow( width , height , (rect.right - rect.left ) , (rect.bottom - rect.top ) ,true);
	GetClientRect(&rect);
 	//以下程序代码建立各个所要用的 DC
	mdc = new CDC;
	mdc1 = new CDC;
	mdc2 = new CDC;
	mdc->CreateCompatibleDC(&dc);
	mdc1->CreateCompatibleDC(&dc);
	mdc2->CreateCompatibleDC(&dc);
	//以下程序代码建立与加载所要用的位图对象
	bgbmp = new CBitmap;
	temp = new CBitmap;
	dark = new CBitmap;
	ball = new CBitmap;
	mask = new CBitmap;
	temp->CreateCompatibleBitmap(&dc,rect.right,rect.bottom);
	dark->CreateCompatibleBitmap(&dc,39,39);
	bgbmp->m_hObject = (HBITMAP)::LoadImage(NULL,"bground.bmp",IMAGE_BITMAP,640,480,LR_LOADFROMFILE);
	ball->m_hObject = (HBITMAP)::LoadImage(NULL,"ball.bmp",IMAGE_BITMAP,39,39,LR_LOADFROMFILE); //载入小球图
	mask->m_hObject = (HBITMAP)::LoadImage(NULL,"mask.bmp",IMAGE_BITMAP,39,39,LR_LOADFROMFILE);
	mdc->SelectObject(temp); //设定 mdc 中储存的位图
	mdc2->SelectObject(dark); //设定 mdc2 中储存的位图
	CPoint *p = new CPoint(50,35); //设定起始坐标
	ClientToScreen(p);             //转换坐标
	::SetCursorPos(p->x,p->y);     //设定鼠标所在位置
	::ShowCursor(false);           //取消鼠标光标显示
		
	ball->GetObject(sizeof(BITMAP),&bm);
	px = new unsigned char[bm.bmHeight*bm.bmWidthBytes];
	ball->GetBitmapBits(bm.bmHeight*bm.bmWidthBytes,px);
	delete p;
}

canvasFrame::~canvasFrame()
{
	delete mdc;
	delete mdc1;
	delete mdc2;
	delete bgbmp;
	delete temp;
	delete dark;
    delete ball;
	delete mask;
	delete px;
}

BEGIN_MESSAGE_MAP(canvasFrame, CFrameWnd)
	//{{AFX_MSG_MAP(canvasFrame)
	ON_WM_MOUSEMOVE()
	ON_WM_KEYDOWN()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// canvasFrame message handlers

void canvasFrame::OnMouseMove(UINT nFlags, CPoint point) 
{
	CClientDC dc(this);
	mdc1->SelectObject(bgbmp);
	mdc->BitBlt(0,0,rect.right,rect.bottom,mdc1,0,0,SRCCOPY);
	mdc1->SelectObject(mask);
	mdc->BitBlt(point.x,point.y,39,39,mdc1,0,0,SRCPAINT);
	mdc1->SelectObject(ball);
	mdc->BitBlt(point.x,point.y,39,39,mdc1,0,0,SRCAND);
	dc.BitBlt(0,0,rect.right,rect.bottom,mdc,0,0,SRCCOPY);
	mdc1->SelectObject(bgbmp);            //取得背景图
	mdc2->BitBlt(0,0,39,39,mdc1,point.x,point.y,SRCCOPY);
	dark->GetObject(sizeof(BITMAP),&bm);
	unsigned char *px1 = new unsigned char[bm.bmHeight*bm.bmWidthBytes];
	dark->GetBitmapBits(bm.bmHeight*bm.bmWidthBytes,px1);
	if(px1[0] == 255 && px1[1] == 0 && px1[2] == 0)
	{
			::ShowCursor(true);            //显示鼠标光标
			MessageBox("过关了!");         //显示过关信息
			CPoint *p = new CPoint(50,35); //设定点坐标
			ClientToScreen(p);             //转换坐标
			::SetCursorPos(p->x,p->y);     //重设鼠标光标位置
			::ShowCursor(false);           //显示鼠标光标
			delete p;
	}
	else
		for(i=0;i<bm.bmHeight*bm.bmWidthBytes;i+=3)
		{
			if(px[i] != 255 && px[i+1] != 255 && px[i+2] !=255)
			{
				b = px[i] & px1[i];		 
				g = px[i+1] & px1[i+1];
				r = px[i+2] & px1[i+2];
				if(b == 0 && g==0 && r==0)
				{
					::ShowCursor(true);            //显示鼠标光标
					MessageBox("碰到了!");         //显示失败信息
					CPoint *p = new CPoint(50,35); //设定点坐标
					ClientToScreen(p);             //转换坐标
					::SetCursorPos(p->x,p->y);     //重设鼠标光标位置
					::ShowCursor(false);           //显示鼠标光标
					delete p;
					break;
				}
			}
		}
	delete px1;
	CFrameWnd::OnMouseMove(nFlags, point);
}

void canvasFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	if(nChar == VK_ESCAPE)
		PostMessage(WM_CLOSE);
	CFrameWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}

⌨️ 快捷键说明

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