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

📄 rainview.cpp

📁 好用的键盘超人源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -