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

📄 winmineview.cpp

📁 这是一个好玩的扫雷程序,用vc实现,其亮点是位图的操作.
💻 CPP
字号:
// WinMineView.cpp : implementation of the CWinMineView class
//

#include "stdafx.h"
#include "WinMine.h"

#include "WinMineDoc.h"
#include "WinMineView.h"
#include "Draw.h"
#include "Operate.h"
#include "MainFrm.h"
#include "CustomDialog.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CWinMineView

IMPLEMENT_DYNCREATE(CWinMineView, CView)

BEGIN_MESSAGE_MAP(CWinMineView, CView)
	//{{AFX_MSG_MAP(CWinMineView)
	ON_WM_LBUTTONDOWN()
	ON_WM_RBUTTONDOWN()
	ON_COMMAND(ID_EASY, OnEasy)
	ON_COMMAND(ID_NORMAL, OnNormal)
	ON_COMMAND(ID_HARD, OnHard)
	ON_UPDATE_COMMAND_UI(ID_EASY, OnUpdateEasy)
	ON_UPDATE_COMMAND_UI(ID_HARD, OnUpdateHard)
	ON_UPDATE_COMMAND_UI(ID_NORMAL, OnUpdateNormal)
	ON_COMMAND(ID_CUSTOM, OnCustom)
	ON_UPDATE_COMMAND_UI(ID_CUSTOM, OnUpdateCustom)
	ON_COMMAND(ID_START, OnStart)
	ON_WM_TIMER()
	ON_WM_LBUTTONUP()
	//}}AFX_MSG_MAP
	ON_WM_MBUTTONDOWN()
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CWinMineView construction/destruction

CWinMineView::CWinMineView()
{
	// TODO: add construction code here
	m_bmp.LoadBitmap(IDB_BITMAP4);

	m_nX = m_nY = 0;
	m_bBegin = false;m_bEnd = false;
	m_bEasy = m_bHard = m_bCustom = false;
	m_bLBDown = false;
	m_bNormal = true;
	m_bMin =  false;
	for(int i = 0; i < m_nRow; i++)
		for(int j = 0; j < m_nColumn; j++)
		{
			MatrixLabel[i][j] = false;
			R_MatrixLabel[i][j] = 0;
		}
}

CWinMineView::~CWinMineView()
{
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CWinMineView drawing

void CWinMineView::OnDraw(CDC* pDC)
{
	CWinMineDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	CBitmap bmp;
	BITMAP info;
	bmp.LoadBitmap(IDB_BITMAP5);
	bmp.GetBitmap(&info);
	CDC mdc;
	mdc.CreateCompatibleDC(pDC);
	mdc.SelectObject(&bmp);


	CDraw draw;
	draw.InitDraw(pDC);	
	draw.DigitsDraw(pDC);
	draw.LBDownDraw(m_nX,m_nY,m_bEnd,pDC);
	draw.TimeDraw(pDC);
	if(m_bEnd)
	{
		this->EnableWindow(0);
	}
	if(!m_bEnd)
		draw.RBDownDraw(pDC);
	if(m_nVisit == bombs)
	{
		draw.SuccessDraw(pDC);
		this->EnableWindow(0);
		KillTimer(1);
	}

	if(m_bLBDown)
	{
		if(m_bEnd)
			pDC->BitBlt((m_nColumn * m_nWidth + 20)/2 -info.bmWidth/2 -4,10,info.bmWidth,info.bmHeight/5,&mdc,0,2*info.bmHeight/5,SRCCOPY);
		else
			pDC->BitBlt((m_nColumn * m_nWidth + 20)/2 -info.bmWidth/2 -4,10,info.bmWidth,info.bmHeight/5,&mdc,0,3*info.bmHeight/5,SRCCOPY);
	}
	else
		pDC->BitBlt((m_nColumn * m_nWidth + 20)/2 -info.bmWidth/2 -4,10,info.bmWidth,info.bmHeight/5,&mdc,0,4*info.bmHeight/5,SRCCOPY);
	CMainFrame *p;
	p = ((CMainFrame*)AfxGetApp()->GetMainWnd());
	if(p->IsZoomed())
		SetTimer(1,1000,NULL);
}

/////////////////////////////////////////////////////////////////////////////
// CWinMineView diagnostics

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

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

CWinMineDoc* CWinMineView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CWinMineDoc)));
	return (CWinMineDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CWinMineView message handlers

void CWinMineView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	m_nY = (point.x-6)/m_nWidth;
	m_nX = (point.y-52)/m_nHeigth;
	m_bLBDown = true;
	if(!MatrixLabel[m_nX][m_nY] && R_MatrixLabel[m_nX][m_nY] !=1 && point.x >= 6 && point.x <= m_nWidth*m_nColumn && point.y >= 52 && point.y <= 52+m_nRow*m_nHeigth)
	{
		
		COperate operate;
	
		if(!m_bBegin)
		{
			SetTimer(1,1000,NULL);
			operate.Random(m_nX,m_nY);
			m_bBegin = true;
		}
		
		if(operate.Check(m_nX,m_nY))
		{
			m_bEnd = true;
			KillTimer(1);
		}
		else
			operate.Search(m_nX,m_nY);
	
	}
	Invalidate(0);
	CView::OnLButtonDown(nFlags, point);
}

void CWinMineView::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	m_nY = (point.x-6)/m_nWidth;
	m_nX = (point.y-52)/m_nHeigth;
	
	if(m_bBegin && !MatrixLabel[m_nX][m_nY] && point.x >= 6 && point.x <= m_nWidth*m_nColumn && point.y >= 52 && point.y <= 52+m_nRow*m_nHeigth)
	{
		COperate operate;
		operate.RButtonDown(m_nX,m_nY);
		Invalidate(0);
	}
	CView::OnRButtonDown(nFlags, point);
}

void CWinMineView::OnMButtonDown(UINT nFlags,CPoint point)
{
	m_nY = (point.x-6)/m_nWidth;
	m_nX = (point.y-52)/m_nHeigth;

	if(MatrixLabel[m_nX][m_nY] && Matrix[m_nX][m_nY] > 0 && point.x >= 6 && point.x <= m_nWidth*m_nColumn && point.y >= 52 && point.y <= 52+m_nRow*m_nHeigth)
	{ 
		COperate operate;
		m_bEnd = operate.MButtonDown(m_nX,m_nY);
		if(m_bEnd)
			KillTimer(1);
		Invalidate(0);
	}
	CView::OnMButtonDown(nFlags,point);
}

void CWinMineView::OnEasy() 
{
	// TODO: Add your command handler code here
	m_bEasy = true;
	m_bNormal = m_bHard = m_bCustom = false;
	RFlag = m_ntime = 0;
	m_nRow = 9;m_nColumn = 9;
	bombs = 10;
	m_nVisit = 81;
	m_bBegin = false;
	m_bEnd = false;
	m_nX = m_nY = 0;
	for(int i = 0; i < m_nRow; i++)
		for(int j = 0; j < m_nColumn; j++)
		{
			MatrixLabel[i][j] = false;
			R_MatrixLabel[i][j] = 0;
		}
	
	CMainFrame * p ;
	p = (CMainFrame *)(AfxGetApp()->GetMainWnd());
	p->MoveWindow(400,200,m_nColumn * m_nWidth + 20,m_nRow * m_nHeigth + 113,true);
	this->EnableWindow(1);
	Invalidate(0);
	KillTimer(1);
}
void CWinMineView::OnNormal() 
{
	// TODO: Add your command handler code here
	m_bNormal = true;
	RFlag = m_ntime = 0;
	m_bEasy = m_bHard = m_bCustom = false;
	m_nRow = 16;m_nColumn = 16;
	bombs = 40;
	m_nVisit = 16 * 16;
	m_bBegin = false;
	m_bEnd = false;
	m_nX = m_nY = 0;
	for(int i = 0; i < m_nRow; i++)
		for(int j = 0; j < m_nColumn; j++)
		{
			MatrixLabel[i][j] = false;
			R_MatrixLabel[i][j] = 0;
		}
	
	CMainFrame * p ;
	p = (CMainFrame *)(AfxGetApp()->GetMainWnd());
	p->MoveWindow(400,200,m_nColumn * m_nWidth + 20,m_nRow * m_nHeigth + 113,true);
	this->EnableWindow(1);
	Invalidate(0);
	KillTimer(1);
}

void CWinMineView::OnHard() 
{
	// TODO: Add your command handler code here
	m_bHard = true;
	RFlag =  m_ntime = 0;
	m_bEasy = m_bNormal = m_bCustom = false;
	m_nRow = 16;m_nColumn = 30;
	bombs = 90;
	m_nVisit = 16 * 30;
	m_bBegin = false;
	m_bEnd = false;
	m_nX = m_nY = 0;
	for(int i = 0; i < m_nRow; i++)
		for(int j = 0; j < m_nColumn; j++)
		{
			MatrixLabel[i][j] = false;
			R_MatrixLabel[i][j] = 0;
		}
	
	CMainFrame * p ;
	p = (CMainFrame *)(AfxGetApp()->GetMainWnd());
	p->MoveWindow(400,200,m_nColumn * m_nWidth + 20,m_nRow * m_nHeigth + 113,true);
	this->EnableWindow(1);
	Invalidate(0);
	KillTimer(1);
}

void CWinMineView::OnUpdateEasy(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(m_bEasy);
}

void CWinMineView::OnUpdateHard(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(m_bHard);
}

void CWinMineView::OnUpdateNormal(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(m_bNormal);
}

void CWinMineView::OnCustom() 
{
	// TODO: Add your command handler code here
	RFlag = m_ntime = 0;
	m_bCustom = true;
	m_bEasy = m_bNormal = m_bHard = false;
	m_bBegin = m_bEnd = false;
	CCustomDialog dlg;
	if(dlg.DoModal() == IDOK)
	{
		if(dlg.m_nHeigth > 24)
			m_nRow = 24;
		else
			if(dlg.m_nHeigth < 9)
				m_nRow = 9;
		else
			m_nRow = dlg.m_nHeigth;
		if(dlg.m_nWidth > 30)
			m_nColumn = 30;
		else
			if(dlg.m_nWidth < 9)
				m_nColumn = 9;
		else
			m_nColumn = dlg.m_nWidth;
		if(dlg.m_nBomb < 10)
			bombs = 10;
		else
			if(dlg.m_nBomb > m_nRow*m_nColumn*3/5)
				bombs = m_nRow*m_nColumn*3/5;
		else
			bombs = dlg.m_nBomb;
		m_nX = m_nY = 0;
		for(int i = 0; i < m_nRow; i++)
			for(int j = 0; j < m_nColumn; j++)
			{
				MatrixLabel[i][j] = false;
				R_MatrixLabel[i][j] = 0;
			}
		m_nVisit = m_nRow*m_nColumn;
		CMainFrame *p;
		p = ((CMainFrame*)AfxGetApp()->GetMainWnd());
		p->MoveWindow(400,200,m_nColumn * m_nWidth + 20,m_nRow * m_nHeigth + 113,true);
		this->EnableWindow(1);
		Invalidate(0);
		KillTimer(1);
	}
}

void CWinMineView::OnUpdateCustom(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(m_bCustom);
}

void CWinMineView::OnStart() 
{
	// TODO: Add your command handler code here
	RFlag = m_ntime = 0;
	m_nX = m_nY = 0;
	m_nVisit = m_nRow*m_nColumn;
	m_bBegin = m_bEnd = false;
	for(int i = 0; i < m_nRow; i++)
		for(int j = 0; j < m_nColumn; j++)
		{
			MatrixLabel[i][j] = false;
			R_MatrixLabel[i][j] = 0;
		}
	this->EnableWindow(1);
	Invalidate(0);
	KillTimer(1);
}

void CWinMineView::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if(nIDEvent == 1)
	{
		m_ntime++;
/*		CBitmap bmp;
		bmp.LoadBitmap(IDB_BITMAP1);
		BITMAP info;
		bmp.GetBitmap(&info);
		CRect rect(m_nColumn*m_nWidth-3*info.bmWidth,10,m_nColumn*m_nWidth-3*info.bmWidth+info.bmWidth,10+info.bmHeight/5);
		this->RedrawWindow(&rect,NULL,RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE );*/
		Invalidate(0);
	}
	CView::OnTimer(nIDEvent);
}

void CWinMineView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	m_bLBDown = false;
	Invalidate(1);
	CView::OnLButtonUp(nFlags, point);
}

⌨️ 快捷键说明

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