
// ReversiView.cpp : CReversiView クラスの実装
//

#include "stdafx.h"
// SHARED_HANDLERS は、プレビュー、縮小版、および検索フィルター ハンドラーを実装している ATL プロジェクトで定義でき、
// そのプロジェクトとのドキュメント コードの共有を可能にします。
#ifndef SHARED_HANDLERS
#include "Reversi.h"
#endif

#include "ReversiDoc.h"
#include "ReversiView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CReversiView

IMPLEMENT_DYNCREATE(CReversiView, CView)

BEGIN_MESSAGE_MAP(CReversiView, CView)
	// 標準印刷コマンド
	ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CReversiView::OnFilePrintPreview)
	ON_WM_CONTEXTMENU()
	ON_WM_RBUTTONUP()
END_MESSAGE_MAP()

// CReversiView コンストラクション/デストラクション

CReversiView::CReversiView()
{

	InitBoard();
}

CReversiView::~CReversiView()
{
}

BOOL CReversiView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: この位置で CREATESTRUCT cs を修正して Window クラスまたはスタイルを
	//  修正してください。

	return CView::PreCreateWindow(cs);
}

// CReversiView 描画

void CReversiView::OnDraw(CDC* pDC)
{
	CReversiDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: この場所にネイティブ データ用の描画コードを追加します。
	DrawBoad(pDC);

}


// CReversiView 印刷


void CReversiView::OnFilePrintPreview()
{
#ifndef SHARED_HANDLERS
	AFXPrintPreview(this);
#endif
}

BOOL CReversiView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// 既定の印刷準備
	return DoPreparePrinting(pInfo);
}

void CReversiView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: 印刷前の特別な初期化処理を追加してください。
}

void CReversiView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: 印刷後の後処理を追加してください。
}

void CReversiView::InitBoard(void)
{
	int x, y;
	for (x = 0; x < MASU_NUM; x++) {
		for (y = 0; y < MASU_NUM; y++) {
			m_Board[x][y] = BLANK;
		}
	}
	m_Board[3][3] = m_Board[4][4] = BLACK_STONE;
	m_Board[3][4] = m_Board[4][3] = WHITE_STONE;

}

void CReversiView::DrawBoad(CDC * pDC)
{
	int x, y;
	CBrush gray_brush, black_brush, white_brush;

	white_brush.CreateStockObject(WHITE_BRUSH);
	gray_brush.CreateSolidBrush(RGB(200, 200, 200));
	black_brush.CreateSolidBrush(RGB(0, 0, 0));
	pDC->SelectObject(&gray_brush);

	for (x = 0; x < MASU_NUM; x++)
	{
		for (y = 0; y < MASU_NUM; y++)
		{
			/* オセロ板の四角を描画する */
			pDC->Rectangle(x * MASU_SIZE, y * MASU_SIZE,
				(x + 1) * MASU_SIZE - 1, (y + 1) * MASU_SIZE - 1);

			/* オセロ板の上にある石を描画する */
			if (m_Board[x][y] == BLANK)continue;
			else if (m_Board[x][y] == BLACK_STONE)pDC->SelectObject(&black_brush);
			else pDC->SelectObject(&white_brush);

			pDC->Ellipse(x * MASU_SIZE + 3, y * MASU_SIZE + 3,
				(x + 1) * MASU_SIZE - 4, (y + 1) * MASU_SIZE - 4);

			pDC->SelectObject(&gray_brush);
		}
	}

	pDC->SelectObject(&white_brush);       //デフォルトのブラシに戻す
}


void CReversiView::OnRButtonUp(UINT /* nFlags */, CPoint point)
{
	ClientToScreen(&point);
	OnContextMenu(this, point);
}

void CReversiView::OnContextMenu(CWnd* /* pWnd */, CPoint point)
{
#ifndef SHARED_HANDLERS
	theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE);
#endif
}


// CReversiView 診断

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

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

CReversiDoc* CReversiView::GetDocument() const // デバッグ以外のバージョンはインラインです。
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CReversiDoc)));
	return (CReversiDoc*)m_pDocument;
}
#endif //_DEBUG


// CReversiView メッセージ ハンドラー
