// aView.cpp : implementation of the CAView class
//
#include "stdafx.h"
#include "a.h"
#include "aDoc.h"
#include "aView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define XPOS_TopLeft 190
#define YPOS_TopLeft 20
#define WIDTH_BoardGrid 33
#define XPOS_Bottom 850
#define YPOS_Bottom 680
#define WIDTH_Point 6
#define WIDTH_Piece 14
#define COLOR_Brush 0x00000000
#define COLOR_PieceBlack 0x00000000
#define COLOR_PieceWhite 0x00EE2908//change to yellow
#define COLOR_Pen 0x00000000
#define WIDTH_Pen 1
/////////////////////////////////////////////////////////////////////////////
// CAView
IMPLEMENT_DYNCREATE(CAView, CView)
BEGIN_MESSAGE_MAP(CAView, CView)
//{{AFX_MSG_MAP(CAView)
ON_WM_LBUTTONDOWN()
ON_WM_RBUTTONDOWN()
//}}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()
/////////////////////////////////////////////////////////////////////////////
// CAView construction/destruction
void CAView::vDrawPiece(CPoint pointBoard, int nType, CDC* pDC)
{
CRgn rgnPiece;
CPoint pointView = ptConvertBP2VP(pointBoard);
rgnPiece.CreateEllipticRgn( pointView.x - WIDTH_Piece,
pointView.y - WIDTH_Piece,
pointView.x + WIDTH_Piece,
pointView.y + WIDTH_Piece);
CBrush brush;
if(nType==1)
//////////////////***************************新增代码******************************//////////////////////
brush.CreateSolidBrush(COLOR_PieceBlack);
if(nType==2)
//////////////////***************************新增代码******************************//////////////////////
brush.CreateSolidBrush(COLOR_PieceWhite);
pDC->FillRgn(&rgnPiece, &brush);
rgnPiece.DeleteObject();
}
CAView::CAView()
{
// TODO: add construction code here
}
CAView::~CAView()
{
}
BOOL CAView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CAView drawing
void CAView::OnDraw(CDC* pDC)
{
CADoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CBrush background;
background.CreateSolidBrush(0XFFFFFF);
CRect rect(0,0,XPOS_Bottom,YPOS_Bottom);
pDC->FillRect(&rect,&background);
int nBoardRowNum=pDoc->nGetBoardRowNum();
CPen pen;
pen.CreatePen(PS_SOLID, WIDTH_Pen, (int)COLOR_Pen);
for(int row=0;row<nBoardRowNum;row++)
{
pDC->MoveTo(XPOS_TopLeft,YPOS_TopLeft+row*WIDTH_BoardGrid);
pDC->SelectObject(&pen);
pDC->LineTo(XPOS_TopLeft+(nBoardRowNum-1)*WIDTH_BoardGrid,YPOS_TopLeft+row*WIDTH_BoardGrid);
}
for(int Column=0;Column<nBoardRowNum;Column++)
{
pDC->MoveTo(XPOS_TopLeft+Column*WIDTH_BoardGrid,YPOS_TopLeft);
pDC->SelectObject(&pen);
pDC->LineTo(XPOS_TopLeft+Column*WIDTH_BoardGrid,YPOS_TopLeft+(nBoardRowNum-1)*WIDTH_BoardGrid);
}
//// Graw 4 Points
CPoint pt;
CBrush brush;
brush.CreateSolidBrush(COLOR_Brush);
CRgn rgnPoint;
rgnPoint.CreateEllipticRgn( 289- WIDTH_Point,
119 - WIDTH_Point,
289 + WIDTH_Point,
119 + WIDTH_Point);
pDC->FillRgn(&rgnPoint, &brush);
rgnPoint.DeleteObject();
rgnPoint.CreateEllipticRgn( 289 - WIDTH_Point,
515- WIDTH_Point,
289 + WIDTH_Point,
515 + WIDTH_Point);
pDC->FillRgn(&rgnPoint, &brush);
rgnPoint.DeleteObject();
rgnPoint.CreateEllipticRgn( 685 - WIDTH_Point,
119 - WIDTH_Point,
685 + WIDTH_Point,
119 + WIDTH_Point);
pDC->FillRgn(&rgnPoint, &brush);
rgnPoint.DeleteObject();
rgnPoint.CreateEllipticRgn( 685 - WIDTH_Point,
515 - WIDTH_Point,
685 + WIDTH_Point,
515 + WIDTH_Point);
pDC->FillRgn(&rgnPoint, &brush);
rgnPoint.DeleteObject();
for(int intege=0;intege<=18;intege++)
{
for(int j=0;j<=18;j++)
{ int ntag=pDoc->nGetTag(intege,j);
if( ntag!=0 )
//以棋盘坐标形式传入
{
pt.x=intege;
pt.y=j;
vDrawPiece(pt, ntag, pDC);
}
}
}
if(pDoc->nWin)
{
if(pDoc->nTotalPiece%2)
{pDC->TextOut(20,300,"执蓝子者获胜!!");}
else
{pDC->TextOut(20,300,"执黑子者获胜 !!");}
}
CPen pen1;
pen1.CreatePen(PS_SOLID, WIDTH_Pen, (int)COLOR_Pen);
pDC->MoveTo(18, 108);
pDC->SelectObject(&pen1);
pDC->LineTo(118, 108);
pDC->LineTo(118, 128);
pDC->LineTo(18, 128);
pDC->LineTo(18, 108);
pDC->MoveTo(18, 178);
pDC->SelectObject(&pen1);
pDC->LineTo(118, 178);
pDC->LineTo(118, 198);
pDC->LineTo(18, 198);
pDC->LineTo(18, 178);
pDC->TextOut(20,110," 保存棋局");
pDC->TextOut(20,180," 前次棋局");
}
BOOL CAView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CAView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CAView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CAView diagnostics
#ifdef _DEBUG
void CAView::AssertValid() const
{
CView::AssertValid();
}
void CAView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CADoc* CAView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CADoc)));
return (CADoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CAView message handlers
/////////////////////////////////////////////////////////////////////////////
CPoint CAView::ptConvertVP2BP(CPoint pointView) const
{
CPoint ptOfBoard;
ptOfBoard.x = (int)((float)(pointView.x - XPOS_TopLeft ) / WIDTH_BoardGrid + 0.5);
ptOfBoard.y = (int)((float)(pointView.y - YPOS_TopLeft ) / WIDTH_BoardGrid + 0.5);
return ptOfBoard;
} // CWzqView::ptConvertVP2BP
// convert view point into board point
CPoint CAView::ptConvertVP2BP(int x, int y) const
{
CPoint ptOfBoard;
ptOfBoard.x = (int)((float)(x - XPOS_TopLeft ) / WIDTH_BoardGrid + 0.5);
ptOfBoard.y = (int)((float)(y - YPOS_TopLeft ) / WIDTH_BoardGrid + 0.5);
return ptOfBoard;
} // CWzqView::ptConvertVP2BP
// convert board point into view point
// CAView printing
CPoint CAView::ptConvertBP2VP(int x, int y) const
{
CPoint ptView;
ptView.x = XPOS_TopLeft + x * WIDTH_BoardGrid;
ptView.y = YPOS_TopLeft + y * WIDTH_BoardGrid;
return ptView;
} // CWzqView::ptConvertBP2VP
// convert board point into view point
CPoint CAView::ptConvertBP2VP(CPoint pointBoard) const
{
CPoint ptView;
ptView.x = XPOS_TopLeft + pointBoard.x * WIDTH_BoardGrid;
ptView.y = YPOS_TopLeft + pointBoard.y * WIDTH_BoardGrid;;
return ptView;
} // CWzqView::ptConvertBP2VP
BOOL CAView::bPointInBoard(CPoint pointView, int nBoardRowNum) const
{
return ( (pointView.x >= XPOS_TopLeft - WIDTH_BoardGrid * 0.5) &&
(pointView.x <= XPOS_TopLeft + (nBoardRowNum - 1) * WIDTH_BoardGrid + WIDTH_BoardGrid * 0.5) &&
(pointView.y >= YPOS_TopLeft - WIDTH_BoardGrid * 0.5) &&
(pointView.y <= YPOS_TopLeft + (nBoardRowNum - 1) * WIDTH_BoardGrid + WIDTH_BoardGrid * 0.5)
);
} // CWzqView::bPointInBoard
BOOL CAView::bPosHaveSet(CPoint pointAtView)
{
CADoc* ppDoc = GetDocument();
CPoint ptAtBoard = ptConvertVP2BP(pointAtView);
return (ppDoc->nBoard[ptAtBoard.x ][ ptAtBoard.y ]);
} //CWzqView::bPosHaveSet
void CAView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CAD