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

📄 boxmanwnd.cpp

📁 经典游戏程序设计:visual c++ 上的推箱子源代码
💻 CPP
字号:
/*++

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

Module Name:

     BoxManWnd.cpp

Abstract:

The Main Frame Class of the Game.

Author:

    Weijian Luo (Arthur Luo)   15-Jun-2005

	E-mail: skybluehacker@yahoo.com.cn

Revision History:      1.0

--*/

#include "stdafx.h"
#include "skyblue_BoxMan.h"
#include "BoxManWnd.h"
#include "HelpDlg.h"
#include "MissionLevelDlg.h"
#include <Mmsystem.h>   //音效  Winmm.lib

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

/////////////////////////////////////////////////////////////////////////////
// CBoxManWnd

IMPLEMENT_DYNCREATE(CBoxManWnd, CWnd)

CBoxManWnd::CBoxManWnd()
{
}

CBoxManWnd::~CBoxManWnd()
{
}


BEGIN_MESSAGE_MAP(CBoxManWnd, CWnd)
	//{{AFX_MSG_MAP(CBoxManWnd)
	ON_COMMAND(ID_MENU_GAME_EXIT, OnMenuGameExit)
	ON_WM_PAINT()
	ON_WM_KEYDOWN()
	ON_COMMAND(ID_MENU_GAME_HELP, OnMenuGameHelp)
	ON_COMMAND(ID_MENU_GAME_LEVEL, OnMenuGameLevel)
	ON_COMMAND(ID_MENU_GAME_MUSIC, OnMenuGameMusic)
	ON_WM_INITMENU()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBoxManWnd message handlers

//
// 退出游戏
//
void CBoxManWnd::OnMenuGameExit() 
{
			PostQuitMessage(0);	
}

//
//  绘图
//
void CBoxManWnd::OnPaint() 
{
	CPaintDC dc(this); // PaintDC设备环境
	CDC memDC;         //内存设备环境
	CRect rt;          //子窗口矩形
	CBitmap memBmp;    //内存位图

	//兼容关联显示设备
	memDC.CreateCompatibleDC(&dc);  
	//获取子区域大小
	GetClientRect(&rt);  

	//初始化位图,使得与显示设备兼容
	memBmp.CreateCompatibleBitmap(&dc,rt.Width(),rt.Height());
	//关联位图
	memDC.SelectObject(&memBmp);
	//在内存设备环境绘制
	m_boxMan.DrawGameArea(&memDC);
	//从内存设备环境一次拷贝整个绘制图像到屏幕
	dc.BitBlt(0,0,rt.Width(),rt.Height(),&memDC,0,0,SRCCOPY);
	
	// Do not call CWnd::OnPaint() for painting messages
}

//
// 键盘消息
//
void CBoxManWnd::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{

	m_boxMan.KeyDown(nChar, nRepCnt, nFlags);
	Invalidate(FALSE);

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

//
// 帮助
//
void CBoxManWnd::OnMenuGameHelp() 
{
	CHelpDlg helpDlg;
	helpDlg.DoModal();	
}

//
// 选关
//
void CBoxManWnd::OnMenuGameLevel() 
{
	CMissionLevelDlg missionDlg;
	missionDlg.m_iMisslionLev = m_boxMan.GetNowMissionNum();

	if(missionDlg.DoModal() == IDOK)
	{
		int iMissionLev = 1;
		iMissionLev = missionDlg.m_iMisslionLev;
		m_boxMan.ChangeMissionNum(iMissionLev);
		Invalidate(FALSE);
	}	
}

void CBoxManWnd::OnMenuGameMusic() 
{
	//作“自反”改变
	m_bSound = (!m_bSound);  

	//CBoxMan对象修改启用声音状态
	m_boxMan.IsSound(m_bSound); 

	//菜单修改是否已经选用标记效果
	if (m_pSubMenu)
	{
		if (m_bSound == TRUE) 
		{
			m_pSubMenu->CheckMenuItem(ID_MENU_GAME_MUSIC, MF_CHECKED | MF_BYCOMMAND);
		}
		else 
		{
			m_pSubMenu->CheckMenuItem(ID_MENU_GAME_MUSIC, MF_UNCHECKED | MF_BYCOMMAND);
		}
	}
}

void CBoxManWnd::OnInitMenu(CMenu* pMenu) 
{
	CWnd::OnInitMenu(pMenu);

	//添加以下部分
	//保存主菜单的句柄到m_pSubMenu	
	if ((m_pSubMenu = pMenu->GetSubMenu(0)) == 0) 
	{
		AfxMessageBox("初始化菜单失败");
		PostQuitMessage(0);
	}
}

void CBoxManWnd::SetCheckSound(void)
{
	m_bSound = (!m_bSound);
	m_boxMan.IsSound(m_bSound);
	if (m_pSubMenu)
	{
		if (m_bSound == TRUE) 
		{
			m_pSubMenu->CheckMenuItem(ID_MENU_GAME_MUSIC, MF_CHECKED | MF_BYCOMMAND);
		}
		else 
		{
			m_pSubMenu->CheckMenuItem(ID_MENU_GAME_MUSIC, MF_UNCHECKED | MF_BYCOMMAND);
		}
	}
}

⌨️ 快捷键说明

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