// CGameDlg.cpp: 实现文件
//
#include "stdafx.h"
#include "LLK.h"
#include "GameDlg.h"
#include "afxdialogex.h"
// CGameDlg 对话框
IMPLEMENT_DYNAMIC(CGameDlg, CDialogEx)
CGameDlg::CGameDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_GAME_DIALOG, pParent)
{
//初始化起始点坐标
m_ptGameTop.x = 50;
m_ptGameTop.y = 50;
//初始化图片元素大小
m_sizeElem.cx = 40;
m_sizeElem.cy = 40;
//初始化游戏更新区域
m_rtGameRect.top = m_ptGameTop.y;
m_rtGameRect.left = m_ptGameTop.x;
m_rtGameRect.right = m_rtGameRect.left + m_sizeElem.cx * MAX_COL;
m_rtGameRect.bottom = m_rtGameRect.top + m_sizeElem.cy * MAX_ROW;
//初始化图标选中状态
m_bFirstPoint = true;
m_bPlaying = false;
}
CGameDlg::~CGameDlg()
{
}
void CGameDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_GAME_TIME, m_GameProgress);
}
BEGIN_MESSAGE_MAP(CGameDlg, CDialogEx)
ON_WM_PAINT()
ON_BN_CLICKED(IDC_BUTTON_START, &CGameDlg::OnClickedButtonStart)
ON_WM_LBUTTONUP()
ON_BN_CLICKED(IDC_BUTTON_TIPS, &CGameDlg::OnClickedButtonTips)
ON_BN_CLICKED(IDC_BUTTON_RESTART, &CGameDlg::OnClickedButtonRestart)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_BUTTON_STOP, &CGameDlg::OnClickedButtonStop)
ON_EN_CHANGE(IDC_EDIT_TIME, &CGameDlg::OnChangeEditTime)
ON_BN_CLICKED(IDC_BUTTON_HELP, &CGameDlg::OnBnClickedButtonHelp)
END_MESSAGE_MAP()
//初始化窗口背景和大小
void CGameDlg::InitBackground()
{ // TODO: 在此处添加实现代码.
//加载BMP图片资源
HANDLE Backbmp = ::LoadImage(NULL, _T("theme\\picture\\fruit_bg.bmp"), IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
//获得当前对话框的视频内容
CClientDC dc(this);
//创建与视频内容兼容的内存DC
m_dcBG.CreateCompatibleDC(&dc);
//将位图资源选入DC
m_dcBG.SelectObject(Backbmp);
//初始化内存DC
m_dcMem.CreateCompatibleDC(&dc);
CBitmap bmpMem;
bmpMem.CreateCompatibleBitmap(&dc, 800, 600);
m_dcMem.SelectObject(&bmpMem);
//hu绘制背景到内存DC中
m_dcMem.BitBlt(0, 0, 800, 600, &m_dcBG, 0, 0, SRCCOPY);
//设置窗口大小
UpdateWindow();
}
BOOL CGameDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 在此添加额外的初始化
//窗口标题
this->SetWindowTextW(_T("欢乐连连看 基本模式"));
//初始化背景
InitBackground();
//初始化元素
InitElement();
//设置进度条隐藏和剩余时间控件
this->GetDlgItem(IDC_GAME_TIME)->ShowWindow(FALSE);
this->GetDlgItem(IDC_EDIT_TIME)->ShowWindow(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void CGameDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CDialogEx::OnPaint()
dc.BitBlt(0, 0, 800, 600, &m_dcMem, 0, 0, SRCCOPY);
}
//初始化元素
void CGameDlg::InitElement() {
CClientDC dc(this);
//加载BMP图片资源
HANDLE Elmbmp = ::LoadImage(NULL, _T("theme\\picture\\fruit_element.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
m_dcElm.CreateCompatibleDC(&dc);
m_dcElm.SelectObject(Elmbmp);
//掩码图加载
HANDLE Maskbmp = ::LoadImage(NULL, _T("theme\\picture\\fruit_mask.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
m_dcMask.CreateCompatibleDC(&dc);
m_dcMask.SelectObject(Maskbmp);
//加载掩盖图片
//加载BMP图片资源
HANDLE hCache = ::LoadImage(NULL, _T("theme\\picture\\fruit_pause.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
//创建与视频内存兼容的内存DC
m_dcCache.CreateCompatibleDC(&dc);
//将位图资源选入DC
m_dcCache.SelectObject(hCache);
}
//开始游戏
void CGameDlg::OnClickedButtonStart()
{
// TODO: 在此添加控件通知处理程序代码
//暂停时不响应
if (m_bPause == true) return;
m_gameControl.StartGame();
//初始时间是300
timeCount = 300;
//判断是否正在玩游戏
m_bPlaying = true;
//禁止【开始游戏】按钮点击
this->GetDlgItem(IDC_BUTTON_START)->EnableWindow(false);
//初始化进度条
m_GameProgress.SetRange(0, 60 * 5); //初始范围
m_GameProgress.SetStep(-1); //初始步数值
m_GameProgress.SetPos(60 * 5); //设置初始值
//启动定时器
this->SetTimer(PLAY_TIMER_ID, 1000, NULL);
//更新地图
UpdateMap();
//更新窗口
Invalidate( FALSE);
//设置进度条隐藏和剩余时间控件
this->GetDlgItem(IDC_GAME_TIME)->ShowWindow(TRUE);
�