📄 winmineview.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 + -