⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 memberdoc.cpp

📁 用于数据结构课程设计,双向链表,并且用了MFC做图形界面
💻 CPP
字号:

// memberDoc.cpp : implementation of the CMemberDoc class
//

#include "stdafx.h"
#include "telephonebook.h"

#include "memberDoc.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
#define CHILD -1
#define PARENT 0
#define OVER 1
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMemberDoc

IMPLEMENT_DYNCREATE(CMemberDoc, CDocument)

BEGIN_MESSAGE_MAP(CMemberDoc, CDocument)
	//{{AFX_MSG_MAP(CMemberDoc)
	ON_UPDATE_COMMAND_UI(ID_FILE_SAVE, OnUpdateFileSave)
	ON_COMMAND(ID_FILE_SAVE, OnFileSave)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMemberDoc construction/destruction

CMemberDoc::CMemberDoc()
{
	TRACE("Entering CMemberDoc constructor\n");
#ifdef _DEBUG
	afxDump.SetDepth(1);
#endif
}

CMemberDoc::~CMemberDoc()
{
}

BOOL CMemberDoc::OnNewDocument()
{
	TRACE("Entering CMemberDoc::OnNewDocument\n");
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)

	return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// CMemberDoc serialization

void CMemberDoc::Serialize(CArchive& ar)
{
    m_memberList.Serialize(ar);
	POSITION position=GetFirstViewPosition();
	CMemberView *pView=(CMemberView*)this->GetNextView(position);
	CTreeCtrl *m_treeCtrl=&pView->m_treeCtrl;
    CString strItemText;
	HTREEITEM hCurrent=NULL;
	HTREEITEM hTest=NULL;
    if (ar.IsStoring())
	{
	   
	   m_iNest=0;
	   if(m_treeCtrl->GetCount()<1)
		   return;
	   hCurrent=m_treeCtrl->GetRootItem();
	  
	   m_iDirection=CHILD;
	   while(m_iDirection!=OVER)
	   {
		   switch(m_iDirection)
		   {
		   case CHILD:
			   char szBuffer[256];
			   TV_ITEM item; 
			  
			   item.hItem=hCurrent;
			   item.mask=TVIF_TEXT|TVIF_CHILDREN;
			   item.pszText=szBuffer;
			   item.cchTextMax=255;
			   m_treeCtrl->GetItem(&item);
			   //save information
			  
			   ar<<m_iNest;
			   strItemText=szBuffer;
			   ar<<strItemText;
			   m_iDirection=CHILD;//get child item if possible
			   //get child item
			   if(m_treeCtrl->ItemHasChildren(hCurrent))
			   {
				   m_iNest=1; //next item is the child of this item
				   hCurrent=m_treeCtrl->GetChildItem(hCurrent);
				   m_iDirection=CHILD;
				   break;
			   }
			   else //no child item
			   {
				   //set base item nest if item has no child
				   m_iNest=0;
				   //Try next sibling item
				   hTest=m_treeCtrl->GetNextSiblingItem(hCurrent);
				   if(hTest!=NULL)
				   {
					   hCurrent=hTest;
					   m_iDirection=CHILD;
					   break;
				   }
				   else
				   {
					   //No slibing, goto parent
					   hTest=m_treeCtrl->GetParentItem(hCurrent);
					   if(hTest==NULL)  //no parent,no sibling
						   m_iDirection=OVER;
					   else
					   {
						   hCurrent=hTest;
						   m_iNest=-1;
						   m_iDirection=PARENT;
					   }
					   break;
				   }
			   }
		   case PARENT:
			   //Try next sibling item
			   hTest=m_treeCtrl->GetNextSiblingItem(hCurrent);
			   if(hTest!=NULL)
			   {
				   hCurrent=hTest;
				   m_iDirection=CHILD;
				   break;
			   }
			   else
			   {
				   //No slibing ,goto parent
				   hTest=m_treeCtrl->GetParentItem(hCurrent);
				   if(hTest==NULL) //no parent no sibling
				   {
					   m_iDirection=OVER;
					   break;
				   }
				   hCurrent=hTest;
				  m_iNest--;
				  m_iDirection=PARENT;
				  break;
			   }
		   }
	   }
	   ar<<32767;  //end of file
	}
	else
	{
		// TODO: add loading code here

		m_treeCtrl->DeleteAllItems();
	    
		ar>>m_iNest;
		if(m_iNest!=0)
		{
			
			return;
		}
		ar>>strItemText;
		hCurrent=m_treeCtrl->InsertItem(strItemText);
		while(hCurrent!=NULL)
		{
			ar>>m_iNest;
			if(m_iNest==32767) //end of file
				return;
			ar>>strItemText;
			if(m_iNest==1)
			{
				hCurrent=m_treeCtrl->InsertItem(strItemText,hCurrent);
				m_treeCtrl->EnsureVisible(hCurrent);
				continue;
			}
			while(m_iNest<0)
			{
				hCurrent=m_treeCtrl->GetParentItem(hCurrent);
				m_iNest++;
			}
			//get parent if root,set root
			hTest=m_treeCtrl->GetParentItem(hCurrent);
			if(hTest==NULL)
				hTest=TVI_ROOT;
			m_treeCtrl->InsertItem(strItemText,hTest);
             
		}
	}
	m_memberList.Serialize(ar);
}


/////////////////////////////////////////////////////////////////////////////
// CMemberDoc diagnostics

#ifdef _DEBUG
void CMemberDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CMemberDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
	dc<<"\n"<<m_memberList<<"\n";
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMemberDoc commands


void CMemberDoc::DeleteContents() 
{
	TRACE("Entering CMemberDoc::DeleteContents\n");

	while(m_memberList.GetHeadPosition()){
		delete m_memberList.RemoveHead();
	}
}

BOOL CMemberDoc::OnOpenDocument(LPCTSTR lpszPathName) 
{	
	TRACE("Enterint CMemberDoc::OnOpenDocument\n");	
	if (!CDocument::OnOpenDocument(lpszPathName))
		return FALSE;
	

	return TRUE;
}

void CMemberDoc::OnUpdateFileSave(CCmdUI* pCmdUI) 
{
   pCmdUI->Enable(IsModified());	
}

void CMemberDoc::OnFileSave() 
{
	// TODO: Add your command handler code here
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -