📄 rainview.cpp
字号:
// rainView.cpp : implementation of the CRainView class
//
#include "stdafx.h"
#include "rain.h"
#include "rainDoc.h"
#include "rainView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CRainView
IMPLEMENT_DYNCREATE(CRainView, CView)
BEGIN_MESSAGE_MAP(CRainView, CView)
//{{AFX_MSG_MAP(CRainView)
ON_WM_TIMER()
ON_WM_CREATE()
ON_WM_CHAR()
ON_COMMAND(ID_MENUITEM_START, OnMenuitemStart)
ON_COMMAND(ID_MENUITEM_STOP, OnMenuitemStop)
ON_COMMAND(ID_MENUITEM_PAUSE, OnMenuitemPause)
ON_UPDATE_COMMAND_UI(ID_MENUITEM_START, OnUpdateMenuitemStart)
ON_UPDATE_COMMAND_UI(ID_MENUITEM_PAUSE, OnUpdateMenuitemPause)
ON_UPDATE_COMMAND_UI(ID_MENUITEM_STOP, OnUpdateMenuitemStop)
ON_COMMAND(ID_MENUITEM_SCORE, OnMenuitemScore)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CRainView construction/destruction
CRainView::CRainView()
{
// TODO: add construction code here
pauseFlag=0;
clientTimer=0;
connectDlg.m_serverIP="127.0.0.1"; //temp code here
}
CRainView::~CRainView()
{
}
/////////////////////////////////////////////////////////////////////////////
// CRainView drawing
void CRainView::OnDraw(CDC* pDC)
{
CRainDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
GetClientRect(&rainRect);
pDC->SetBkMode(TRANSPARENT);
switch(pDoc->getRainState())
{
case RS_STOPPED:
drawDemo(pDC);
break;
case RS_RUNNING:
drawRain(pDC);
if(pDoc->rainType!=RT_LOCAL)
{
drawConnectState(pDC);
}
break;
default:
drawRain(pDC);
}
drawMsg(pDC);
}
/////////////////////////////////////////////////////////////////////////////
// CRainView diagnostics
#ifdef _DEBUG
void CRainView::AssertValid() const
{
CView::AssertValid();
}
void CRainView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CRainDoc* CRainView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CRainDoc)));
return (CRainDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CRainView message handlers
void CRainView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CRainDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
int ret;
CString tmpStr;
//check TICK_TIMER_EVENT
if(nIDEvent==TICK_TIMER_EVENT)
{
pDoc->tick_timer++;
}
//check DFT_TIMER_EVENT
if(nIDEvent==DFT_TIMER_EVENT)
{
switch (pDoc->getRainState())
{
case RS_STOPPED:
pDoc->rainDemo();
if(pDoc->getDemoState()==1)
{
return; //do not call Invalidate(false)
}
if((pDoc->getDemoState()==0)&&(pDoc->getDemoStep()==0))
{
pDoc->setDemoState(1);
}
break;
case RS_CONNECTING:
if(pDoc->client.getConnectState()!=CONNECTION_LOST)
{
pDoc->setRainState(RS_CONNECTED);
pDoc->setRainMsg(CONNECTED_MSG);
stateDlg.setFlag(1);
ret=stateDlg.DoModal();
if(ret!=IDOK)//user abort
{
pDoc->initRain();
pDoc->setRainState(RS_STOPPED);
pDoc->setRainMsg(STOPPED_MSG);
}
}
else
{
if(connectTimer==CONNECT_TIME)
{
pDoc->setRainState(RS_STOPPED);
pDoc->setRainMsg(STOPPED_MSG);
MessageBox("Unable connect to Rain Server!","Rain",MB_OK|MB_ICONWARNING);
pDoc->initRain();//
}
else
{
pDoc->client.Connect("199.36.57.66",1818);//
connectTimer++;
}
}
break;
case RS_BEGINNING:
tmpStr.Format(" %d ",timeLeft);
pDoc->setRainMsg(BEGINNING_MSG+tmpStr);
MessageBeep(MB_OK);
if(timeLeft--==-1)
{
SetTimer(STEP_TIMER_EVENT,pDoc->stepTime,NULL);
pDoc->setRainState(RS_RUNNING);
pDoc->setRainMsg(RUNNING_MSG);
}
break;
case RS_ACCEPTING:
case RS_RUNNING:
case RS_CONNECTED:
if (stateDlg.isShow())
{
stateDlg.updateList(); //only work if ACCEPTING or CONNECTED
}
//server need check client and send request
if(pDoc->rainType==RT_SERVER)
{
pDoc->server.checkSlave();
pDoc->server.req();
}
//client need check server
if(pDoc->rainType==RT_CLIENT)
{
if(pDoc->client.getConnectState()==CONNECTION_SAFE)
{
clientTimer=0;
pDoc->client.setConnectState(CONNECTION_DANGER);
}
else//CONNECTION_DANGER
{
clientTimer++;
if(clientTimer==CLIENT_TIME)
{
if(stateDlg.isShow())
{
stateDlg.close();
}
pDoc->initRain();
pDoc->setRainState(RS_STOPPED);
pDoc->setRainMsg(STOPPED_MSG);
MessageBox("Lost connection to Rain Server!","Rain",MB_OK|MB_ICONWARNING);
}
}
}
break;
}
Invalidate(false);
}
//check STEP_TIMER_EVENT
if(nIDEvent==STEP_TIMER_EVENT)
{
switch (pDoc->getRainState())
{
case RS_RUNNING:
pDoc->countTime();
if(pDoc->rainStep())
{
//rain is finishing
pDoc->setRainState(RS_STOPPING);
pDoc->setRainMsg(STOPPING_MSG);
}
break;
case RS_STOPPING:
if(pDoc->rainType==RT_SERVER)
{
pDoc->server.end();//
}
KillTimer(STEP_TIMER_EVENT);
doResultReport();
doHighScore();
pDoc->initRain();
pDoc->setRainState(RS_STOPPED);
pDoc->setRainMsg(STOPPED_MSG);
break;
}
Invalidate(false);
}
CView::OnTimer(nIDEvent);
}
int CRainView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
CRainDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
rainFont1.CreateFont(-14,
0,
0,
0,
600,//FW_NORMAL==400,
FALSE,
FALSE,
FALSE,
ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
PROOF_QUALITY,
DEFAULT_PITCH|FF_MODERN,
"ms sans serif");
rainFont2.CreateFont(-12,
0,
0,
0,
400,//FW_NORMAL==400,
FALSE,
FALSE,
FALSE,
ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
PROOF_QUALITY,
DEFAULT_PITCH|FF_MODERN,
"courier new");
rainFont3.CreateFont(-25,
0,
0,
0,
600,//FW_NORMAL==400,
FALSE,
FALSE,
FALSE,
ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
PROOF_QUALITY,
DEFAULT_PITCH|FF_MODERN,
"ms sans serif");
rainFont4.CreateFont(-35,
0,
0,
0,
600,//FW_NORMAL==400,
FALSE,
FALSE,
FALSE,
ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
PROOF_QUALITY,
DEFAULT_PITCH|FF_MODERN,
"ms sans serif");
SetTimer(DFT_TIMER_EVENT,DFT_TIMER,NULL);
SetTimer(TICK_TIMER_EVENT,TICK_TIMER,NULL);
return 0;
}
void CRainView::drawRain(CDC* pDC)
{
// draw the black ground
CRainDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->SelectObject(&rainFont1);
pDC->SelectStockObject(BLACK_BRUSH);
pDC->Rectangle(0,
0,
rainRect.Width(),
rainRect.Height()-CHARHEIGHT*MSG_Y);
for (int i=0;i<RAIN_Y;i++)
{
if (pDoc->getStrState(i)==STR_USE)
{
if (pDoc->isFittestStr(i))
{
// draw the maxfit string
pDC->SetTextColor(RGB(255,255,255));
pDC->TextOut((pDoc->getStrWhereX(i))*CHARWIDTH,
(pDoc->getStrWhereY(i))*CHARHEIGHT,
pDoc->getStr(i));
// draw the hit part of the maxfit string
pDC->SetTextColor(RGB(255,0,0));
pDC->TextOut((pDoc->getStrWhereX(i))*CHARWIDTH,
(pDoc->getStrWhereY(i))*CHARHEIGHT,
pDoc->getFittestStr());
}
else
{
// draw a string
pDC->SetTextColor(RGB(200,200,200));
pDC->TextOut((pDoc->getStrWhereX(i))*CHARWIDTH,
(pDoc->getStrWhereY(i))*CHARHEIGHT,
pDoc->getStr(i));
}
}
if (pDoc->getStrState(i)==STR_FREEING)
{
// draw the string which is freeing
pDC->SetTextColor(RGB(255,0,0));
pDC->TextOut((pDoc->getStrWhereX(i))*CHARWIDTH,
(pDoc->getStrWhereY(i))*CHARHEIGHT,
pDoc->getStr(i));
}
if (pDoc->getStrState(i)==STR_FREEING2)
{
// draw the string which is freeing
pDC->SetTextColor(RGB(255,255,100));
pDC->TextOut((pDoc->getStrWhereX(i))*CHARWIDTH,
(pDoc->getStrWhereY(i))*CHARHEIGHT,
pDoc->getStr(i));
}
if (pDoc->getStrState(i)==STR_WAITING)
{
// draw the string which is WAITING
pDC->SetTextColor(RGB(255,0,0));
pDC->TextOut((pDoc->getStrWhereX(i))*CHARWIDTH,
(pDoc->getStrWhereY(i))*CHARHEIGHT,
pDoc->getStr(i));
}
}
}
void CRainView::drawMsg(CDC* pDC)
{
// draw the MSG eara background
CRainDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->SelectObject(&rainFont1);
pDC->SelectStockObject(LTGRAY_BRUSH);
pDC->Rectangle(0,
rainRect.Height()-CHARHEIGHT*MSG_Y,
rainRect.Width(),
rainRect.Height());
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -