// 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, "MS ゴシック" }; 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, "MS ゴシック" }; 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, "MS ゴシック" }; 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); } }