www.pudn.com > CHECKER.zip > CHECKDOC.CPP


// checkdoc.cpp : implementation of the CCheckerDoc class 
// 
 
#include "stdafx.h" 
#include "checker.h" 
 
 
#include "checkdoc.h" 
#include "debugvw.h" 
 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char BASED_CODE THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CCheckerDoc 
 
IMPLEMENT_DYNCREATE(CCheckerDoc, CDocument) 
 
BEGIN_MESSAGE_MAP(CCheckerDoc, CDocument) 
        //{{AFX_MSG_MAP(CCheckerDoc) 
	ON_COMMAND(IDM_DEBUGWIN, OnDebugwin) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CCheckerDoc construction/destruction 
 
CCheckerDoc::CCheckerDoc() : m_statearray(8,8) 
{ 
	    int x,y; 
		m_selectflag=FALSE; 
		for (y=0;y<3;y++) 
		  for (x=!(y%2);x<8;x+=2) 
		     m_statearray.SetAt(x,y,CELL_BLACK); 
	 	for (y=5;y<8;y++) 
		  for (x=!(y%2);x<8;x+=2) 
        	m_statearray.SetAt(x,y,CELL_RED); 
		movenum=0; 
} 
 
CCheckerDoc::~CCheckerDoc() 
{ 
} 
 
BOOL CCheckerDoc::OnNewDocument() 
{ 
        if (!CDocument::OnNewDocument()) 
                return FALSE; 
 
        // TODO: add reinitialization code here 
        // (SDI documents will reuse this document) 
 
        return TRUE; 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CCheckerDoc serialization 
 
void CCheckerDoc::Serialize(CArchive& ar) 
{ 
       if (ar.IsStoring()) 
	     ar<<(DWORD)movenum; 
	   else 
	     { 
		 DWORD move; 
		 ar>>move; 
		 movenum=move; 
		 } 
       m_statearray.Serialize(ar); 
	    
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CCheckerDoc diagnostics 
 
#ifdef _DEBUG 
void CCheckerDoc::AssertValid() const 
{ 
        CDocument::AssertValid(); 
} 
 
void CCheckerDoc::Dump(CDumpContext& dc) const 
{ 
        CDocument::Dump(dc); 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CCheckerDoc commands 
 
STATE CCheckerDoc::CellState(int x,int y) 
  { 
  return m_statearray.GetAt(x,y); 
  }			    
 
void CCheckerDoc::SetCellState(int x,int y,STATE s) 
  { 
  CPoint pt(x,y); 
  m_statearray.SetAt(x,y,s); 
  UpdateAllViews(NULL,(LPARAM)&pt); 
  SetModifiedFlag(); 
  } 
 
// Count cells -- if typ==CELL_RED count CELL_RED and CELL_REDKING 
// if typ==CELL_BLACK count CELL_BLACK and CELL_BLACKKING  
int CCheckerDoc::Count(STATE typ) 
  { 
  int i,max=m_statearray.GetUpperBound(),ct=0; 
  if (max==-1) return 0; 
  for (i=0;i<=max;i++) 
    { 
	STATE s=m_statearray[i]; 
	if (typ==s) ct++; 
	if (typ==CELL_RED && s==CELL_REDKING) ct++; 
	if (typ==CELL_BLACK && s==CELL_BLACKKING) ct++; 
	}  
  return ct; 
  } 
 
 
void CCheckerDoc::OnDebugwin()  
{ 
#if 1  // Easy way to make a new view -- use doc templates 
    CMultiDocTemplate temptemplate(IDR_DEBUGTYPE,RUNTIME_CLASS(CCheckerDoc), 
      RUNTIME_CLASS(CMDIChildWnd),RUNTIME_CLASS(DebugView)); 
	CFrameWnd *frame=temptemplate.CreateNewFrame(this,NULL); 
	if (!frame) 
	  AfxMessageBox("Can't create debug window"); 
	else 
	  frame->InitialUpdateFrame(this,TRUE); 
#else // hard way -- do all the work yourself 
		CMDIChildWnd *frame=new CMDIChildWnd; 
	if (!frame->Create(NULL,"Debug output: "+GetTitle())) 
	  { 
	  AfxMessageBox("Can't create debug window frame"); 
	  return; 
	  } 
 
	DebugView *view=new DebugView; 
	// Don't care about size -- RecalcLayout will resize anyway. 
	if (!view->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW,CRect(0,0,0,0),frame,AFX_IDW_PANE_FIRST)) 
	  { 
	  AfxMessageBox("Can't create debug window view"); 
	  frame->DestroyWindow(); 
	  } 
	// add view to document (this) 
    AddView(view); 
	// Make sure OnInitialUpdate fires 
	frame->InitialUpdateFrame(this,TRUE); 
	// Layout frame 
	frame->RecalcLayout(); 
#endif 
}