// MfcKatsunariView.cpp : CMfcKatsunariView クラスの動作の定義を行います。
//

#include "stdafx.h"
#include "MfcKatsunari.h"

#include "MfcKatsunariDoc.h"
#include "MfcKatsunariView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMfcKatsunariView

IMPLEMENT_DYNCREATE(CMfcKatsunariView, CView)

BEGIN_MESSAGE_MAP(CMfcKatsunariView, CView)
	//{{AFX_MSG_MAP(CMfcKatsunariView)
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	ON_WM_SETCURSOR()
	ON_MESSAGE(WM_INITIAL_LOADED,OnInitialLoaded)
	ON_MESSAGE(WM_NEXT_MOVE,OnNextMove)
	ON_WM_ERASEBKGND()
	ON_COMMAND(IDM_DISP_LARGE, OnDispLarge)
	ON_UPDATE_COMMAND_UI(IDM_DISP_LARGE, OnUpdateDispLarge)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMfcKatsunariView クラスの構築/消滅

CMfcKatsunariView::CMfcKatsunariView()
{
	BITMAP work;
	m_Bmp.LoadBitmap(IDB_TITLE);
	m_Bmp.GetBitmap(&work);
	m_BmpWidth=work.bmWidth;
	m_BmpHeight=work.bmHeight;
	m_BoardBmp[0].LoadBitmap(IDB_GAMEBOARD);   // ビットマップのハンドル
	m_BoardBmp[1].LoadBitmap(IDB_GAMEBOARD_L); // ビットマップのハンドル

	FILE *fp;
	char line[3];
	boardSize = BOARD_SIZE;
	pureBoardSize = PURE_BOARD_SIZE;
	if( (fopen_s(&fp, "mctsgo.ini", "r")) == 0 ){
		if( fgets( line, 3, fp ) != NULL){
			if(strcmp(line, "9") == 0 || strcmp(line, "9\n") == 0){
				boardSize = 11;
				pureBoardSize = 9;
			}else if(strcmp(line, "13") == 0 || strcmp(line, "13\n") == 0){
				boardSize = 15;
				pureBoardSize = 13;
			}
		}
	}
	fclose(fp);

	CDC dc;
	dc.CreateCompatibleDC(NULL); // メモリデバイスコンテキストのハンドル
	CBitmap* OldBmp=dc.SelectObject(&m_BoardBmp[0]); // ビットマップのオブジェクトを選択

	// 碁盤に桝目を描く
	int x,y=1;
		dc.MoveTo( 1*16+8-17,y*16+8-17);
		dc.LineTo(pureBoardSize*16+8-17,y*16+8-17);
	for(y=1;y<=pureBoardSize;y++) {
		dc.MoveTo( 1*16+8-17,y*16+8-17);
		dc.LineTo(pureBoardSize*16+8-17,y*16+8-17);
	}
	for(x=1;x<=pureBoardSize;x++) {
		dc.MoveTo(x*16+8-17, 1*16+8-17);
		dc.LineTo(x*16+8-17,pureBoardSize*16+8-17);
	}
	if (pureBoardSize==19) {
		// 星
		dc.DrawIcon( 4*16-17, 4*16-17,hHoshiIcon[0]);
		dc.DrawIcon( 4*16-17,10*16-17,hHoshiIcon[0]);
		dc.DrawIcon( 4*16-17,16*16-17,hHoshiIcon[0]);
		dc.DrawIcon(10*16-17, 4*16-17,hHoshiIcon[0]);
		dc.DrawIcon(10*16-17,10*16-17,hHoshiIcon[0]);
		dc.DrawIcon(10*16-17,16*16-17,hHoshiIcon[0]);
		dc.DrawIcon(16*16-17, 4*16-17,hHoshiIcon[0]);
		dc.DrawIcon(16*16-17,10*16-17,hHoshiIcon[0]);
		dc.DrawIcon(16*16-17,16*16-17,hHoshiIcon[0]);
	} else if (pureBoardSize==13) {
		// 星
		dc.DrawIcon( 4*16-17, 4*16-17,hHoshiIcon[0]);
		dc.DrawIcon( 4*16-17,10*16-17,hHoshiIcon[0]);
		dc.DrawIcon(10*16-17, 4*16-17,hHoshiIcon[0]);
		dc.DrawIcon(10*16-17,10*16-17,hHoshiIcon[0]);
		dc.DrawIcon( 7*16-17, 7*16-17,hHoshiIcon[0]);
	} else if (pureBoardSize==9) {
		// 星
		dc.DrawIcon( 3*16-17, 3*16-17,hHoshiIcon[0]);
		dc.DrawIcon( 3*16-17, 3*16-17,hHoshiIcon[0]);
		dc.DrawIcon( 5*16-17, 5*16-17,hHoshiIcon[0]);
		dc.DrawIcon( 7*16-17, 7*16-17,hHoshiIcon[0]);
		dc.DrawIcon( 7*16-17, 7*16-17,hHoshiIcon[0]);
	}

	// 大きい碁盤
	dc.SelectObject(&m_BoardBmp[1]); // ビットマップのオブジェクトを選択
	// 碁盤に桝目を描く
	for(y=1;y<=pureBoardSize;y++) {
		dc.MoveTo( 1*24+12-25,y*24+12-25);
		dc.LineTo(pureBoardSize*24+12-25,y*24+12-25);
	}
	for(x=1;x<=pureBoardSize;x++) {
		dc.MoveTo(x*24+12-25, 1*24+12-25);
		dc.LineTo(x*24+12-25,pureBoardSize*24+12-25);
	}
	if (pureBoardSize==19) {
		// 星
		dc.DrawIcon( 4*24-25, 4*24-25,hHoshiIcon[1]);
		dc.DrawIcon( 4*24-25,10*24-25,hHoshiIcon[1]);
		dc.DrawIcon( 4*24-25,16*24-25,hHoshiIcon[1]);
		dc.DrawIcon(10*24-25, 4*24-25,hHoshiIcon[1]);
		dc.DrawIcon(10*24-25,10*24-25,hHoshiIcon[1]);
		dc.DrawIcon(10*24-25,16*24-25,hHoshiIcon[1]);
		dc.DrawIcon(16*24-25, 4*24-25,hHoshiIcon[1]);
		dc.DrawIcon(16*24-25,10*24-25,hHoshiIcon[1]);
		dc.DrawIcon(16*24-25,16*24-25,hHoshiIcon[1]);
	} else if (pureBoardSize==13) {
		// 星
		dc.DrawIcon( 4*24-25, 4*24-25,hHoshiIcon[1]);
		dc.DrawIcon( 4*24-25,10*24-25,hHoshiIcon[1]);
		dc.DrawIcon(10*24-25, 4*24-25,hHoshiIcon[1]);
		dc.DrawIcon(10*24-25,10*24-25,hHoshiIcon[1]);
		dc.DrawIcon( 7*24-25, 7*24-25,hHoshiIcon[1]);
	} else if (pureBoardSize==9) {
		// 星
		dc.DrawIcon( 3*24-25, 3*24-25,hHoshiIcon[1]);
		dc.DrawIcon( 3*24-25, 7*24-25,hHoshiIcon[1]);
		dc.DrawIcon( 5*24-25, 5*24-25,hHoshiIcon[1]);
		dc.DrawIcon( 7*24-25, 3*24-25,hHoshiIcon[1]);
		dc.DrawIcon( 7*24-25, 7*24-25,hHoshiIcon[1]);
	}
	
	m_OpeningAnimation=1;
	m_MessagePos=200;

	m_MsgAreaRect[0].left=0;
	m_MsgAreaRect[0].top=328;
	m_MsgAreaRect[0].right=600;
	m_MsgAreaRect[0].bottom=352;

	m_MsgAreaRect[1].left=0;
	m_MsgAreaRect[1].top=484;
	m_MsgAreaRect[1].right=600;
	m_MsgAreaRect[1].bottom=508;
	
	IsDisplayLarge=0;

	oldx=oldy=0;
}

CMfcKatsunariView::~CMfcKatsunariView()
{
	m_Bmp.DeleteObject();
	m_BoardBmp[0].DeleteObject();
	m_BoardBmp[1].DeleteObject();
//	RemoveFontResource("KatuSmall.FNT");
//	::SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0);
}

BOOL CMfcKatsunariView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: この位置で CREATESTRUCT cs を修正して Window クラスまたはスタイルを
	//       修正してください。

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMfcKatsunariView クラスの描画

static LOGFONT LogFont={
		-15,
		0,
		0,
		0,
		400,
		FALSE,
		FALSE,
		FALSE,
		SHIFTJIS_CHARSET,
		OUT_DEFAULT_PRECIS,
		CLIP_DEFAULT_PRECIS,
		DRAFT_QUALITY,
		DEFAULT_PITCH | FF_DONTCARE,
		"ＭＳ ゴシック"
};

static LOGFONT SmallLogFont={
		-8,
		0,
		0,
		0,
		400,
		FALSE,
		FALSE,
		FALSE,
		SHIFTJIS_CHARSET,
		OUT_DEFAULT_PRECIS,
		CLIP_DEFAULT_PRECIS,
		DRAFT_QUALITY,
		DEFAULT_PITCH | FF_DONTCARE,
		"ＭＳ ゴシック"
};

static LOGFONT SmallLogFont2={
		-12,
		0,
		0,
		0,
		400,
		FALSE,
		FALSE,
		FALSE,
		SHIFTJIS_CHARSET,
		OUT_DEFAULT_PRECIS,
		CLIP_DEFAULT_PRECIS,
		DRAFT_QUALITY,
		DEFAULT_PITCH | FF_DONTCARE,
		"ＭＳ ゴシック"
};


static char *PlayerStrHontai[]=
{
"","あなた","MCTS試行","通信"
};

static char **PlayerStr=&PlayerStrHontai[1];

void CMfcKatsunariView::OnDraw(CDC* pDC)
{
	CMfcKatsunariDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

// 碁盤の桝目を消す
//	CDC dcx;
//	dcx.CreateCompatibleDC(NULL); // メモリデバイスコンテキストのハンドル
//	dcx.SelectObject(&m_BoardBmp[0]); // ビットマップのオブジェクトを選択
//	CPen pen1, *pen0;
//	pen1.CreatePen(PS_SOLID, 4, RGB(0xcc, 0x99, 0x00));  // 幅2ピクセルの実線
//	pen0 = dcx.SelectObject(&pen1);  // ペンを設定
//	int yy=1;
//		dcx.MoveTo( 1*16+8-17,yy*16+8-17);
//		dcx.LineTo(PURE_BOARD_SIZE*16+8-17,yy*16+8-17);
//	dcx.SelectObject(pen0);  // 元のペンにもどしておく

//	boardSize = pDoc->boardSize;
//	pureBoardSize = boardSize - 2;

	if (m_OpeningAnimation) {
		if (m_OpeningAnimation==1) {
			m_OpeningAnimation=2;
			pDoc->LoadInitialFiles();
		}
		CFont Font;
		Font.CreateFontIndirect(&LogFont);
		CFont *OldFont=pDC->SelectObject(&Font);
		pDC->SetBkMode(TRANSPARENT);

		pDC->SetTextColor(RGB(128,128,128));
		pDC->TextOut(101,301,"データファイルを読み込み中です…しばらくお待ちください。");
		pDC->SetTextColor(RGB(0,0,0));
		pDC->TextOut(100,300,"データファイルを読み込み中です…しばらくお待ちください。");
		pDC->SelectObject(OldFont);
		return;
	}

	int x,y;

	// 碁盤を書いて
	CDC dc;
	dc.CreateCompatibleDC(pDC);
	CBitmap* OldBmp;
	if (IsDisplayLarge) {
		OldBmp=dc.SelectObject(&m_BoardBmp[1]);
		pDC->BitBlt(
			25,25,456,456,
			&dc,
			0,0,
			SRCCOPY
		);
	} else {
		OldBmp=dc.SelectObject(&m_BoardBmp[0]);
		pDC->BitBlt(
			17,17,304,304,
			&dc,
			0,0,
			SRCCOPY
		);
	}


	CFont Font;
	Font.CreateFontIndirect(&LogFont);
	CFont *OldFont=pDC->SelectObject(&Font);
	char Buf[256];
	pDC->SetBkMode(TRANSPARENT);
//	pDC->SetBkColor(GetSysColor(COLOR_WINDOW));
	pDC->SetBkColor(RGB(255,224,224));
	pDC->SetTextColor(RGB(0,0,0));

	CRect client;
	GetClientRect(&client);
	for(y=1;y<=pureBoardSize/*PURE_BOARD_SIZE*/;y++) {
		sprintf_s(Buf,sizeof(Buf),"%d",y);
		pDC->TextOut((IsDisplayLarge?8:4)+4*(y<10 ? 1:0),y*(IsDisplayLarge?24:16)+(IsDisplayLarge?4:0),Buf);
	}
	for(x=1;x<=pureBoardSize/*PURE_BOARD_SIZE*/;x++) {
		sprintf_s(Buf,sizeof(Buf),"%2d",x);
		pDC->TextOut(x*(IsDisplayLarge?24:16)-4*(x<10 ? 1:0)+(IsDisplayLarge?4:0),(IsDisplayLarge?8:4),Buf);
	}

	// 石を置く
	for(y=1;y<=pureBoardSize/*PURE_BOARD_SIZE*/;y++) {
		for(x=1;x<=pureBoardSize/*PURE_BOARD_SIZE*/;x++) {
			int temp=pDoc->Ban[y][x];
			if (temp==BLACK || temp==WHITE) {
				pDC->DrawIcon(x*(IsDisplayLarge?24:16),y*(IsDisplayLarge?24:16),hStoneIcon[pDoc->Ban[y][x]][IsDisplayLarge?1:0]);
			} else if (temp!=SPACE) {
				pDC->DrawIcon(x*(IsDisplayLarge?24:16),y*(IsDisplayLarge?24:16),hStoneIcon[pDoc->Ban[y][x]][IsDisplayLarge?1:0]);
			}
		}
	}
	// マークをつける
	if (pDoc->move>1) {
		pDC->DrawIcon(pDoc->LastX*(IsDisplayLarge?24:16),pDoc->LastY*(IsDisplayLarge?24:16),hMarkIcon[IsDisplayLarge?1:0]);
	}

	
	if (pDoc->Teban==HUMAN) {
		CPoint point;
		GetCursorPos(&point);
		ScreenToClient(&point);
		int xx=(point.x-(IsDisplayLarge?12:8))/(IsDisplayLarge?24:16);
		int yy=(point.y-(IsDisplayLarge?12:8))/(IsDisplayLarge?24:16);
		if (1<=xx && xx<=pureBoardSize/*PURE_BOARD_SIZE*/ && 1<=yy && yy<=pureBoardSize/*PURE_BOARD_SIZE*/) {
			pDC->DrawIcon(xx*(IsDisplayLarge?24:16),yy*(IsDisplayLarge?24:16),hRedSquareIcon[IsDisplayLarge?1:0]);
		}
	}

	CFont SmallFont;
	if (pDoc->DispLastValue) {
		if (IsDisplayLarge) {
			SmallFont.CreateFontIndirect(&SmallLogFont2);
		} else {
			SmallFont.CreateFontIndirect(&SmallLogFont);
		}
		pDC->SelectObject(&SmallFont);
		int r,g,b;
		r=pDoc->R;
		g=pDoc->G;
		b=pDoc->B;
		pDC->SetTextColor(RGB(r,g,b));
		for(y=1;y<=pureBoardSize/*PURE_BOARD_SIZE*/;y++) {
			for(x=1;x<=pureBoardSize/*PURE_BOARD_SIZE*/;x++) {
				int temp=pDoc->Value[y][x];
				char tmpBuf[256];
				if (temp!=-1000) {
					sprintf_s(tmpBuf,sizeof(tmpBuf),"%d",temp);
					pDC->TextOut(x*(IsDisplayLarge?24:16)+(2*(4-strlen(tmpBuf))),y*(IsDisplayLarge?24:16)+(IsDisplayLarge?8:4),tmpBuf);
				}
			}
		}
	}

	
	// 揚げ浜/Player/消費時間の表示
	// pDC->SetBkMode(OPAQUE);
	pDC->SelectObject(&Font);
	pDC->SetTextColor(RGB(0,0,0));
	CPen Pen(PS_SOLID,2,RGB(0,0,0));
	CPen* OldPen=pDC->SelectObject(&Pen);

	int XPOS;
	if (pureBoardSize/*PURE_BOARD_SIZE*/==9) { // 9路
		XPOS=280;
	} else if (pureBoardSize/*PURE_BOARD_SIZE*/==13) { // 13路
		/*XPOS=360*/;
		if (IsDisplayLarge) {
			XPOS=512;
		} else {
			XPOS=360;
		}
	} else { // 19路
		if (IsDisplayLarge) {
			XPOS=512;
		} else {
			XPOS=360;
		}
	}


	pDC->MoveTo(XPOS,9*16+8);
	pDC->LineTo(XPOS,21*16+8);
	pDC->LineTo(XPOS+176,21*16+8);
	pDC->LineTo(XPOS+176,9*16+8);
	pDC->LineTo(XPOS,9*16+8);
	pDC->MoveTo(XPOS,6*16+9*16+8);
	pDC->LineTo(XPOS+176,6*16+9*16+8);
	pDC->SelectObject(OldPen);
	pDC->MoveTo(XPOS,2*16+9*16+8);
	pDC->LineTo(XPOS+176,2*16+9*16+8);
	pDC->MoveTo(XPOS,8*16+9*16+8);
	pDC->LineTo(XPOS+176,8*16+9*16+8);


	pDC->DrawIcon(XPOS+1*16,1*16+9*16,hStoneIcon[BLACK][0]);
	sprintf_s(Buf,sizeof(Buf),"黒： (%3d) %2d,%2d",pDoc->LastMove[BLACK],pDoc->LastMoveX[BLACK],pDoc->LastMoveY[BLACK]);
	pDC->TextOut(XPOS+2*16,1*16+9*16,Buf);
	sprintf_s(Buf,sizeof(Buf),"　名前　：%s",PlayerStr[pDoc->BWSide[BLACK]]);
	pDC->TextOut(XPOS+1*16,3*16+9*16,Buf);
	int t=pDoc->getSpentTime(BLACK);
	sprintf_s(Buf,sizeof(Buf),"消費時間： %02d:%02d:%02d",t/3600,t/60%60,t%60);
	pDC->TextOut(XPOS+1*16,4*16+9*16,Buf);
	sprintf_s(Buf,sizeof(Buf),"アゲハマ：  %4d",pDoc->hama[BLACK]);
	pDC->TextOut(XPOS+1*16,5*16+9*16,Buf);


	pDC->DrawIcon(XPOS+1*16,7*16+9*16,hStoneIcon[WHITE][0]);
	sprintf_s(Buf,sizeof(Buf),"白:  (%3d) %2d,%2d",pDoc->LastMove[WHITE],pDoc->LastMoveX[WHITE],pDoc->LastMoveY[WHITE]);
	pDC->TextOut(XPOS+2*16,7*16+9*16,Buf);
	sprintf_s(Buf,sizeof(Buf),"　名前　：%s",PlayerStr[pDoc->BWSide[WHITE]]);
	pDC->TextOut(XPOS+1*16,9*16+9*16,Buf);
	t=pDoc->getSpentTime(WHITE);
	sprintf_s(Buf,sizeof(Buf),"消費時間： %02d:%02d:%02d",t/3600,t/60%60,t%60);
	pDC->TextOut(XPOS+1*16,10*16+9*16,Buf);
	sprintf_s(Buf,sizeof(Buf),"アゲハマ：  %4d",pDoc->hama[WHITE]);
	pDC->TextOut(XPOS+1*16,11*16+9*16,Buf);

	// 勝也のメッセージの表示
//	pDC->TextOut(0,m_MsgAreaRect[IsDisplayLarge?1:0].top,pDoc->Message);

	pDC->SelectObject(OldFont);

	// 「勝也」の表示
	dc.SelectObject(&m_Bmp);
	pDC->StretchBlt(
		XPOS,16,m_BmpWidth,m_BmpHeight,
		&dc,
		0,0,m_BmpWidth,m_BmpHeight,
		SRCCOPY
	);
	dc.SelectObject(OldBmp);
	dc.DeleteDC();
}

/////////////////////////////////////////////////////////////////////////////
// CMfcKatsunariView クラスの印刷

BOOL CMfcKatsunariView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// デフォルトの印刷準備
	return DoPreparePrinting(pInfo);
}

void CMfcKatsunariView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: 印刷前の特別な初期化処理を追加してください。
}

void CMfcKatsunariView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: 印刷後の後処理を追加してください。
}

/////////////////////////////////////////////////////////////////////////////
// CMfcKatsunariView クラスの診断

#ifdef _DEBUG
void CMfcKatsunariView::AssertValid() const
{
	CView::AssertValid();
}

void CMfcKatsunariView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CMfcKatsunariDoc* CMfcKatsunariView::GetDocument() // 非デバッグ バージョンはインラインです。
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMfcKatsunariDoc)));
	return (CMfcKatsunariDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMfcKatsunariView クラスのメッセージ ハンドラ


void CMfcKatsunariView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// 石が置ければ石を置く。置けなければ無視する。
	CMfcKatsunariDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (pDoc->Teban==HUMAN) {
		int x=(point.x-(IsDisplayLarge?12:8))/(IsDisplayLarge?24:16);
		int y=(point.y-(IsDisplayLarge?12:8))/(IsDisplayLarge?24:16);
		if (x<1 || y<1 || x>pDoc->getSize()/*PURE_BOARD_SIZE*/ || y>pDoc->getSize()/*PURE_BOARD_SIZE*/) {
			MessageBeep(MB_ICONEXCLAMATION);
			goto Break;
		}
		if(pDoc->checkSetStoneGameBoard(x,y, pDoc->color, pDoc->move) != TRUE) {
			MessageBeep(MB_ICONEXCLAMATION);
			goto Break;
		}
		pDoc->NextMove(x,y);
	} else {
		MessageBeep(MB_ICONEXCLAMATION);
	}
Break:
	CView::OnLButtonDown(nFlags, point);
}

void CMfcKatsunariView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
	
	CView::OnMouseMove(nFlags, point);
	CMfcKatsunariDoc* pDoc = GetDocument();
	CRect InvalidRect;
	if (pDoc->Teban==HUMAN) {
		int x=(point.x-(IsDisplayLarge?12:8))/(IsDisplayLarge?24:16);
		int y=(point.y-(IsDisplayLarge?12:8))/(IsDisplayLarge?24:16);
		if (x!=oldx || y!=oldy) {
			InvalidRect.left=oldx*(IsDisplayLarge?24:16);
			InvalidRect.top =oldy*(IsDisplayLarge?24:16);
			InvalidRect.right=oldx*(IsDisplayLarge?24:16)+(IsDisplayLarge?24:16);
			InvalidRect.bottom=oldy*(IsDisplayLarge?24:16)+(IsDisplayLarge?24:16);
			InvalidateRect(InvalidRect,FALSE);
			oldx=x;
			oldy=y;
		}
		if (x<1 || y<1 || x>pDoc->getSize()/*PURE_BOARD_SIZE*/ || y>pDoc->getSize()/*PURE_BOARD_SIZE*/) {
			::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
		} else {
			::SetCursor(hStoneCursor[pDoc->color][IsDisplayLarge?1:0]);
			InvalidRect.left=x*(IsDisplayLarge?24:16);
			InvalidRect.top =y*(IsDisplayLarge?24:16);
			InvalidRect.right=x*(IsDisplayLarge?24:16)+(IsDisplayLarge?24:16);
			InvalidRect.bottom=y*(IsDisplayLarge?24:16)+(IsDisplayLarge?24:16);
			InvalidateRect(InvalidRect,FALSE);
		}
	} else {
		::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
	}
}

BOOL CMfcKatsunariView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
	// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
	if (nHitTest!=HTCLIENT) {	
		return CView::OnSetCursor(pWnd, nHitTest, message);
	}
	return TRUE;
}

#pragma warning(push)
#pragma warning(disable:4100)
LRESULT CMfcKatsunariView::OnInitialLoaded(WPARAM w,LPARAM l)
{
	m_OpeningAnimation=w;

	CRect client;
	GetClientRect(client);
	if (w) {
		InvalidateRect(client,FALSE);
	} else {
		InvalidateRect(client,TRUE);
		PostMessage(WM_COMMAND,IDM_DISP_LARGE,(long)m_hWnd);
	}
	// 大きくする
	return 0;
}

LRESULT CMfcKatsunariView::OnNextMove(WPARAM w,LPARAM l)
{
	CMfcKatsunariDoc* pDoc = GetDocument();

	pDoc->NextMove(w,l);
	return 0;
}

LRESULT CMfcKatsunariView::OnKatsunariMessage(WPARAM w,LPARAM l)
{
	CMfcKatsunariDoc* pDoc = GetDocument();

	strcpy_s(pDoc->Message,sizeof(CMfcKatsunariDoc::Message),(char *)l);
	InvalidateRect(m_MsgAreaRect[IsDisplayLarge?1:0],TRUE);
	return 0;
}
#pragma warning(pop)

void CMfcKatsunariView::OnUpdate(/*CView* pSender, */LPARAM lHint, CObject* pHint) 
{
	CRect client;
	CMfcKatsunariDoc *pDocW1=GetDocument();
	if (pHint==NULL || lHint || pDocW1->DispLastValue) {
		GetClientRect(client);
		InvalidateRect(client,TRUE);
		return;
	}

	CUpdateKatsunari *p=(CUpdateKatsunari *)pHint;
	CRect InvalidRect;
	CDC *pDC=GetDC();

	for(int y=1;y<=pureBoardSize;y++) {
		for(int x=1;x<=pureBoardSize;x++) {
			if (p->NewBan[y][x]!=p->OldBan[y][x] || (x==p->OldX && y==p->OldY)) {
				if (p->NewBan[y][x]==8 && p->OldBan[y][x]==BLACK) {
					CMfcKatsunariDoc* pDocW2 = GetDocument();
					pDocW2->Ban[y][x]=17;
				} else if (p->NewBan[y][x]==7 && p->OldBan[y][x]==WHITE) {
					CMfcKatsunariDoc* pDocW2 = GetDocument();
					pDocW2->Ban[y][x]=18;
				}
				InvalidRect.left=x*(IsDisplayLarge?24:16);
				InvalidRect.top =y*(IsDisplayLarge?24:16);
				InvalidRect.right=x*(IsDisplayLarge?24:16)+(IsDisplayLarge?24:16);
				InvalidRect.bottom=y*(IsDisplayLarge?24:16)+(IsDisplayLarge?24:16);
				InvalidateRect(InvalidRect,FALSE);
			}
		}
	}

	if (pureBoardSize==9) {
		InvalidRect.left=360;
		InvalidRect.top=9*16+8;
		InvalidRect.right=536;
		InvalidRect.bottom=21*16+8;
		InvalidateRect(InvalidRect,TRUE);
	} else if (pureBoardSize==13) {
		InvalidRect.left=360;
		InvalidRect.top=9*16+8;
		InvalidRect.right=536;
		InvalidRect.bottom=21*16+8;
		InvalidateRect(InvalidRect,TRUE);
	} else {
		InvalidRect.left=(IsDisplayLarge?512:360);
		InvalidRect.top=9*16+8;
		InvalidRect.right=(IsDisplayLarge?512:360)+536-360;
		InvalidRect.bottom=21*16+8;
		InvalidateRect(InvalidRect,TRUE);
	}
	ReleaseDC(pDC);
}

BOOL CMfcKatsunariView::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
	CRect rect;
	pDC->GetClipBox(&rect);

	CBrush BackBrush(RGB(153,228,255));
	CBrush *OldBrush=pDC->SelectObject(&BackBrush);
	pDC->PatBlt(rect.left,rect.top,rect.Width(),rect.Height(),PATCOPY);
	pDC->SelectObject(OldBrush);
	return TRUE;
//	return CView::OnEraseBkgnd(pDC);
}

void CMfcKatsunariView::OnDispLarge() 
{
	if (IsDisplayLarge) {
		IsDisplayLarge=0;			
	} else {
		IsDisplayLarge=1;
	}
	GetDocument()->UpdateAllViews(NULL);

	CRect rect;
	AfxGetMainWnd()->GetWindowRect(&rect);


	if (IsDisplayLarge) {
		rect.right=rect.left+725;
		rect.bottom=rect.top+600;
	} else {
		rect.right=rect.left+575;
		rect.bottom=rect.top+450;
	}
	AfxGetMainWnd()->MoveWindow(&rect);
}

void CMfcKatsunariView::OnUpdateDispLarge(CCmdUI* pCmdUI) 
{
	pCmdUI->m_bEnableChanged = TRUE;
	if (!GetDocument()->Initialized) {
		pCmdUI->Enable(FALSE);
	} else {
		pCmdUI->Enable(TRUE);
		pCmdUI->SetCheck(IsDisplayLarge);
	}
}
