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

📄 chineseqiview.cpp

📁 一款用C++编写的网络版中国象棋对弈程序源代码
💻 CPP
字号:
// chineseqiView.cpp : implementation of the CChineseqiView class
//

#include "stdafx.h"
#include "chineseqi.h"
#include "mainfrm.h"
#include "chineseqiDoc.h"
#include "chineseqiView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CChineseqiView

IMPLEMENT_DYNCREATE(CChineseqiView, CView)

BEGIN_MESSAGE_MAP(CChineseqiView, CView)
	//{{AFX_MSG_MAP(CChineseqiView)
	ON_COMMAND(RENSHU, OnRENSHU)
	ON_WM_ERASEBKGND()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_WM_RBUTTONUP()
	ON_COMMAND(CREATE, OnCREATE)
	ON_COMMAND(JOIN, OnJOIN)
	ON_WM_DESTROY()
	ON_WM_SIZE()
	ON_WM_SETCURSOR()
	ON_WM_LBUTTONDOWN()
	ON_COMMAND(SETUP, OnSETUP)
	ON_WM_CREATE()
	ON_COMMAND(REGRET, OnREGRET)
	ON_COMMAND(WHATTHIS, OnWHATTHIS)
	ON_COMMAND(STATUS, OnSTATU)
	ON_WM_CHAR()
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CChineseqiView construction/destruction

CChineseqiView::CChineseqiView()
{
	// TODO: add construction code here
	bepop=FALSE;
	hasbegin=FALSE;
	moving=FALSE;
	nowmoveobj.obj=0;
	nowmoveobj.left=0;
	nowmoveobj.top=0;
	nowmoveobj.x=-1;
	nowmoveobj.y=-1;
	marginleft=0;
	margintop=0;
	CBitmap bmp;
	bmp.LoadBitmap(BOARD);
	BITMAP bm;
	bmp.GetObject(sizeof(BITMAP),&bm);
	boardwidth=bm.bmWidth;
	boardheight=bm.bmHeight;
	bered=FALSE; 
	hasright=TRUE;
	hasbegin=FALSE;
	bkcolor=RGB(0,0,0);
	wihich=1;
	nowseek=0;
	bemoveing=FALSE;
	blninput=FALSE;
	qishu *qi=new qishu();
	qi->initqi();
	qiarray.Add(qi);
	nowseek++;
	myqi=new qishu();
	nowthick=0;
	myapp=AfxGetApp();
	handcur=LoadCursor(AfxGetInstanceHandle(),MAKEINTRESOURCE(HAND));
	movecur=LoadCursor(AfxGetInstanceHandle(),MAKEINTRESOURCE(HANDMOVE));
	busycur=LoadCursor(AfxGetInstanceHandle(),MAKEINTRESOURCE(BUSY));
	m_timeout=20000;
	myselfcolor=RGB(0,0,255);
	othercolor=RGB(255,0,0);
	editcolor=RGB(0,255,0);
	quitthread=FALSE;
	getreadinfo=FALSE;
}

CChineseqiView::~CChineseqiView()
{
	qiarray.RemoveAll();
	strlist.RemoveAll();
	DeleteObject(handcur);
	DeleteObject(movecur);
	DeleteObject(busycur);
	delete myqi;
	if(mainsocket)
	{
		mainsocket->Close();
		delete mainsocket;
	}
	if(comsocket)
	{
		comsocket->Close();
		delete comsocket;
	}
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CChineseqiView drawing

void CChineseqiView::OnDraw(CDC* pDC)
{

	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CChineseqiView printing
void CChineseqiView::drawqi(CDC *dc)
{
	CDC memdc ;
	memdc.CreateCompatibleDC(dc);
	CRect rect;
	GetClientRect(&rect);
	int i;
	int j;
	int left;
	int top;
	int width;
	int height;
	BITMAP bm;
	CBitmap bmp;
	dc->FillSolidRect(&rect,bkcolor);
	if (bkmap.m_hObject)
	{
		bkmap.GetObject(sizeof(BITMAP),&bm);
		CBitmap * old=memdc.SelectObject(&bkmap);
		switch (wihich)
		{	
		case 1:
			for(i=0;i<rect.Width();i+=bm.bmWidth )
				for(j=0;j<rect.Height();j+=bm.bmHeight )
					dc->BitBlt(i,j,bm.bmWidth,bm.bmHeight,&memdc,0,0,SRCCOPY); 
			break;
		case 2:
			dc->StretchBlt( 0,0,rect.Width(),rect.Height(),&memdc,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
			break;
		case 3:
			left=(rect.Width()-bm.bmWidth)/2;
			top=(rect.Height()-bm.bmHeight)/2;
			if (top<0) top=0;
			if (left<0) left=0;
			width=bm.bmWidth;
			height=bm.bmHeight;
			if (width>rect.Width()) width=rect.Width();
			if(height>rect.Height()) height=rect.Height();
			dc->BitBlt(left,top,width,height,&memdc,0,0,SRCCOPY);
			break;
		}
	memdc.SelectObject(old);
	}
	bmp.LoadBitmap(BOARD);
//	dc->BitBlt(marginleft+70,margintop,boardwidth,boardheight,&memdc,0,0,SRCCOPY);
	TransparentBlt(dc,marginleft+70,margintop,boardwidth,boardheight,&bmp,0,0,RGB(0,0,0));
	bmp.DeleteObject ();
	if(myqi->jiang)
	{
		bmp.LoadBitmap(JIANGJUN);
    	TransparentBlt(dc,marginleft+180,margintop+80,100,200,&bmp,0,0,RGB(0,0,0));
		bmp.DeleteObject();
	}
	for (i=0;i<9;i++)
			for (j=0;j<10;j++)
			{
				if (myqi->qi[j][i]==0) continue;
				if (bered)
				{
					switch (myqi->qi[j][i])
					{
					case 1:
						bmp.LoadBitmap (REDZHU);
						break;
					case 2:
						bmp.LoadBitmap(REDMA);
						break;
					case 3:
						bmp.LoadBitmap(REDPAO);
						break;
					case 4:
						bmp.LoadBitmap(REDXIANG);
						break;
					case 5:
						bmp.LoadBitmap(REDSHI);
						break;
					case 6:
						bmp.LoadBitmap(REDSUAI);
						break;
					case 7:
						bmp.LoadBitmap(REDBIN);
						break;
					case -1:
						bmp.LoadBitmap (BLACKZHU);
						break;
					case -2:
						bmp.LoadBitmap(BLACKMA);
						break;
					case -3:
						bmp.LoadBitmap(BLACKPAO);
						break;
					case -4:
						bmp.LoadBitmap(BLACKXIANG);
						break;
					case -5:
						bmp.LoadBitmap(BLACKSHI);
						break;
					case -6:
						bmp.LoadBitmap(BLACKJIANG);
						break;
					case -7:
						bmp.LoadBitmap(BLACKBIN);
						break;
					}
				}
				else
				{
					switch (myqi->qi[j][i])
					{
					case -1:
						bmp.LoadBitmap (REDZHU);
						break;
					case -2:
						bmp.LoadBitmap(REDMA);
						break;
					case -3:
						bmp.LoadBitmap(REDPAO);
						break;
					case -4:
						bmp.LoadBitmap(REDXIANG);
						break;
					case -5:
						bmp.LoadBitmap(REDSHI);
						break;
					case -6:
						bmp.LoadBitmap(REDSUAI);
						break;
					case -7:
						bmp.LoadBitmap(REDBIN);
						break;
					case 1:
						bmp.LoadBitmap (BLACKZHU);
						break;
					case 2:
						bmp.LoadBitmap(BLACKMA);
						break;
					case 3:
						bmp.LoadBitmap(BLACKPAO);
						break;
					case 4:
						bmp.LoadBitmap(BLACKXIANG);
						break;
					case 5:
						bmp.LoadBitmap(BLACKSHI);
						break;
					case 6:
						bmp.LoadBitmap(BLACKJIANG);
						break;
					case 7:
						bmp.LoadBitmap(BLACKBIN);
						break;
					}
				}
			//old=memdc.SelectObject(&bmp);
			TransparentBlt(dc,marginleft+70+i*35,margintop+j*35,35,35,&bmp,0,0,RGB(6,0,255));
			bmp.DeleteObject();
			}
}
void CChineseqiView::drawdead(CDC *dc)
{
  int i;
  CBitmap bmp;
	for (i=0;i<16;i++)
	{
		if (myqi->mydead[i]==0) break;
		if (bered)
		{
			switch (myqi->mydead[i])
			{
			case 1:
				bmp.LoadBitmap (REDZHU);
				break;
			case 2:
				bmp.LoadBitmap(REDMA);
				break;
			case 3:
				bmp.LoadBitmap(REDPAO);
				break;
			case 4:
				bmp.LoadBitmap(REDXIANG);
				break;
			case 5:
				bmp.LoadBitmap(REDSHI);
				break;
			case 6:
				bmp.LoadBitmap(REDSUAI);
				break;
			case 7:
				bmp.LoadBitmap(REDBIN);
				break;
			}
		}
		else
		{
			switch (myqi->mydead[i])
			{
			case 1:
				bmp.LoadBitmap (BLACKZHU);
				break;
			case 2:
				bmp.LoadBitmap(BLACKMA);
				break;
			case 3:
				bmp.LoadBitmap(BLACKPAO);
				break;
			case 4:
				bmp.LoadBitmap(BLACKXIANG);
				break;
			case 5:
				bmp.LoadBitmap(BLACKSHI);
				break;
			case 6:
				bmp.LoadBitmap(BLACKJIANG);
				break;
			case 7:
				bmp.LoadBitmap(BLACKBIN);
				break;
			}
		}
	TransparentBlt(dc,marginleft+(i/8)*35,margintop+(9-i%8)*35,35,35,&bmp,0,0,RGB(6,0,255));
	bmp.DeleteObject();
	}
	for (i=0;i<16;i++)
	{
		if (myqi->otherdead[i]>=0) break;
		if (myqi->otherdead[i]<-7) break;
		if (bered)
		{
			switch (myqi->otherdead[i])
			{
			case -1:
				bmp.LoadBitmap (BLACKZHU);
				break;
			case -2:
				bmp.LoadBitmap(BLACKMA);
				break;
			case -3:
				bmp.LoadBitmap(BLACKPAO);
				break;
			case -4:
				bmp.LoadBitmap(BLACKXIANG);
				break;
			case -5:
				bmp.LoadBitmap(BLACKSHI);
				break;
			case -6:
				bmp.LoadBitmap(BLACKJIANG);
				break;
			case -7:
				bmp.LoadBitmap(BLACKBIN);
				break;
			}
		}
		else
		{
			switch (myqi->otherdead[i])
			{
			case -1:
				bmp.LoadBitmap (REDZHU);
				break;
			case -2:
				bmp.LoadBitmap(REDMA);
				break;
			case -3:
				bmp.LoadBitmap(REDPAO);
				break;
			case -4:
				bmp.LoadBitmap(REDXIANG);
				break;
			case -5:
				bmp.LoadBitmap(REDSHI);
				break;
			case -6:
				bmp.LoadBitmap(REDSUAI);
				break;
			case -7:
				bmp.LoadBitmap(REDBIN);
				break;
			}
		}
	TransparentBlt(dc,marginleft+(11+(1-i/8))*35,margintop+(i%8)*35,35,35,&bmp,0,0,RGB(6,0,255));
	bmp.DeleteObject();
	}
}
void CChineseqiView::drawmoveobj(CDC *dc)
{
	if (nowmoveobj.obj==0) return;
	CDC memdc ;
	memdc.CreateCompatibleDC(dc);
	CBitmap bmp;
	CBitmap *old;
	old=memdc.SelectObject(&nowmoveobj.bmp);
	memdc.BitBlt(0,0,34,34,dc,nowmoveobj.left,nowmoveobj.top,SRCCOPY);
	memdc.SelectObject(old);
	memdc.DeleteDC();
		if (bered)
		{
			switch (nowmoveobj.obj)
			{
			case 1:
				bmp.LoadBitmap (REDZHU);
				break;
			case 2:
				bmp.LoadBitmap(REDMA);
				break;
			case 3:
				bmp.LoadBitmap(REDPAO);
				break;
			case 4:
				bmp.LoadBitmap(REDXIANG);
				break;
			case 5:
				bmp.LoadBitmap(REDSHI);
				break;
			case 6:
				bmp.LoadBitmap(REDSUAI);
				break;
			case 7:
				bmp.LoadBitmap(REDBIN);
				break;
			case -1:
				bmp.LoadBitmap (BLACKZHU);
				break;
			case -2:
				bmp.LoadBitmap(BLACKMA);
				break;
			case -3:
				bmp.LoadBitmap(BLACKPAO);
				break;
			case -4:
				bmp.LoadBitmap(BLACKXIANG);
				break;
			case -5:
				bmp.LoadBitmap(BLACKSHI);
				break;
			case -6:
				bmp.LoadBitmap(BLACKJIANG);
				break;
			case -7:
				bmp.LoadBitmap(BLACKBIN);
				break;
			}
		}
		else
		{
			switch (nowmoveobj.obj)
			{
			case -1:
				bmp.LoadBitmap (REDZHU);
				break;
			case -2:
				bmp.LoadBitmap(REDMA);
				break;
			case -3:
				bmp.LoadBitmap(REDPAO);
				break;
			case -4:
				bmp.LoadBitmap(REDXIANG);
				break;
			case -5:
				bmp.LoadBitmap(REDSHI);
				break;
			case -6:
				bmp.LoadBitmap(REDSUAI);
				break;
			case -7:
				bmp.LoadBitmap(REDBIN);
				break;
			case 1:
				bmp.LoadBitmap (BLACKZHU);
				break;
			case 2:
				bmp.LoadBitmap(BLACKMA);
				break;
			case 3:
				bmp.LoadBitmap(BLACKPAO);
				break;
			case 4:
				bmp.LoadBitmap(BLACKXIANG);
				break;
			case 5:
				bmp.LoadBitmap(BLACKSHI);
				break;
			case 6:
				bmp.LoadBitmap(BLACKJIANG);
				break;
			case 7:
				bmp.LoadBitmap(BLACKBIN);
				break;
			}
		}
	//old=memdc.SelectObject(&bmp);
	TransparentBlt(dc,nowmoveobj.left,nowmoveobj.top,35,35,&bmp,0,0,RGB(6,0,255));
	bmp.DeleteObject();
	
}
void CChineseqiView::TransparentBlt(CDC * pDestDc, int x, int y, int w, int h, CBitmap * pBmp, int sx, int sy, COLORREF crTransparent)
{
	CDC memDC, maskDC, tempDC;
	maskDC.CreateCompatibleDC(pDestDc);
	CBitmap maskBitmap;
	
	//add these to store return of SelectObject() calls
	CBitmap* pOldMemBmp = NULL;
	CBitmap* pOldMaskBmp = NULL;
	
	memDC.CreateCompatibleDC(pDestDc);
	tempDC.CreateCompatibleDC(pDestDc);
	CBitmap bmpImage;
	bmpImage.CreateCompatibleBitmap( pDestDc, w, h);
	pOldMemBmp = memDC.SelectObject( &bmpImage );

	CBitmap * oldBmp = tempDC.SelectObject(pBmp);
	
	memDC.BitBlt( 0,0,w, h, &tempDC, sx, sy, SRCCOPY );
	
	// Create monochrome bitmap for the mask
	maskBitmap.CreateBitmap(w, h, 1, 1, NULL);
	pOldMaskBmp = maskDC.SelectObject( &maskBitmap );
	memDC.SetBkColor(crTransparent);
	
	// Create the mask from the memory DC
	maskDC.BitBlt(0, 0, w, h, &memDC, 0, 0, SRCCOPY);
	
	memDC.SetBkColor(RGB(0,0,0));
	memDC.SetTextColor(RGB(255,255,255));
	memDC.BitBlt(0, 0, w, h, &maskDC, 0, 0, SRCAND);
	
	// Set the foreground to black. See comment above.
	pDestDc->SetBkColor(RGB(255,255,255));
	pDestDc->SetTextColor(RGB(0,0,0));
	pDestDc->BitBlt(x, y, w, h, &maskDC, 0, 0, SRCAND);
	
	// Combine the foreground with the background
	pDestDc->BitBlt(x, y, w, h, &memDC, 0, 0, SRCPAINT);
	
	tempDC.SelectObject(oldBmp);
	if (pOldMaskBmp) maskDC.SelectObject( pOldMaskBmp );
	if (pOldMemBmp)  memDC.SelectObject( pOldMemBmp );
}

BOOL CChineseqiView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CChineseqiView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CChineseqiView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CChineseqiView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CChineseqiView message handlers
void CChineseqiView::restore()
{
		bered=!bered;
		if(!getreadinfo) hasbegin=FALSE;
		AfxGetMainWnd()->GetMenu()->EnableMenuItem(REGRET, MF_BYCOMMAND|MF_GRAYED);
		//AfxGetMainWnd()->GetMenu()->CheckMenuItem(REGRET,MF_CHECKED);
		myqi->initqi();
		quitthread=FALSE;
		nowmoveobj.obj=0;
		hasright=FALSE;
		nowseek=0;
		qiarray.RemoveAll();
		strlist.RemoveAll();
		showstring="";
		qishu * qi =new qishu();
		qi->initqi();
		qiarray.Add(qi);
		nowseek++;
		if(bered)
		{
			hasright=TRUE;
			//SetCursor(handcur);
		}
		Invalidate();
		/*if(hasright)
		{
			setpanel("侈

⌨️ 快捷键说明

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