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

📄 paintdoc.cpp

📁 这是书上的代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	}
	return 0;
}


void CPaintobjDoc::SaveBin(CArchive& ar,UINT ver)
{
	char str1='W';
	USHORT  version=ver; 	
	CTime Time = CTime::GetCurrentTime();	
	CString str3="GOOD MORNING";
	if(ver!=1)
	{
		ar<<str1;
		ar<<version;
		ar<<Time;
		ar<<str3;
	}
	ar<<(USHORT) m_Objectsnode.GetSize();
	// Load the nodes data one by one
	for (USHORT i = 0; i < m_Objectsnode.GetSize(); i++)
	{
		CNode* pNode = m_Objectsnode[i];
		ar << pNode->m_uId;
		ar << pNode->m_uType;
		if(ver!=1)
		{
			ar << pNode->m_uExtType;
		}
		ar << pNode->x;
		ar << pNode->y;
		if(ver!=1)
		{
			ar <<pNode->m_fHeading;
		}
	}
	ar << (USHORT) m_Objectspath.GetSize();	
	// Save the path objects one by one
	for (USHORT j = 0; j < m_Objectspath.GetSize(); j++)
	{
		CPath* pPath = m_Objectspath[j];
		// First, Save the type of path
		ar << pPath->m_uType;

		ar << pPath->m_uId;
		ar << pPath->m_uStartNode;
		ar << pPath->m_uEndNode;
		ar << pPath->m_fVeloLimit;
		ar << pPath->m_uGuideType;
		if(ver!=1)
		{
			ar << pPath->m_uExtType;
		}


//		LINE_TYPE, SPP_TYPE, SPLINE_TYPE, SCP_TYPE, SIDE_TYPE,
//					 LAZY_S_TYPE,ARC_TYPE
		//直线路径
		if(pPath->m_uType==LINE_TYPE)
		{			
			ar << ((CLinePath*) pPath)->m_uObstacle;
			ar << ((CLinePath*) pPath)->m_uHeading;
		}
		//圆弧路径
		else if(pPath->m_uType==SPP_TYPE || pPath->m_uType==SPLINE_TYPE || pPath->m_uType==ARC_TYPE)
		{				
			ar << ((CArcPath*) pPath)->m_uObstacle;
			ar << ((CArcPath*) pPath)->m_uHeading;
			ar << ((CArcPath*) pPath)->m_fCenterx;
			ar << ((CArcPath*) pPath)->m_fCentery;
			ar << ((CArcPath*) pPath)->m_uDirection;
		}
		//懒-S路径
		else if(pPath->m_uType==LAZY_S_TYPE)
		{
			ar << ((CLazysPath*) pPath)->m_angStart;
		}
		//其他路径
	}
}
void CPaintobjDoc::SaveText(CString name,UINT ver)
{
	FILE *fp;
	fp=fopen(name,"w");
	//ar << m_Objectsnode.GetSize();	
	CTime Time = CTime::GetCurrentTime();
	//CTime t( 1999, 3, 19, 22, 15, 0 ); 
	// 10:15PM March 19, 1999	
	CString s = Time.Format( "%A, %B %d, %Y, %H : %M : %S" );	
	if(ver!=1)
	{
		fprintf(fp,"%s\n","W");
		fprintf(fp,"%d\n",ver);
		fprintf(fp,"%s\n",s);
		fprintf(fp,"%s\n","GOOD MORNING");
	}
	fprintf(fp,"%d\n",m_Objectsnode.GetSize());
	// Load the nodes data one by one
	for (USHORT i = 0; i < m_Objectsnode.GetSize(); i++)
	{
		CNode* pNode = m_Objectsnode[i];
		//ar << pNode->m_uId << pNode->m_uType << pNode->m_uExtType
		//<< pNode->x << pNode->y<<pNode->m_fHeading;	
		if(ver==1)
		{
			fprintf(fp,"%d,	%d,	%f,	%f\n",pNode->m_uId,pNode->m_uType,pNode->x,pNode->y);
		}
		else
		{
			fprintf(fp,"%d,	%d,	%d,	%f,	%f,	%f\n",pNode->m_uId,pNode->m_uType,pNode->m_uExtType,pNode->x,pNode->y,pNode->m_fHeading);
		}
	}
	//ar << m_Objectspath.GetSize();
	fprintf(fp,"%d\n",m_Objectspath.GetSize());
	// Save the path objects one by one
	for (USHORT j = 0; j < m_Objectspath.GetSize(); j++)
	{
		CPath* pPath = m_Objectspath[j];
		// First, Save the type of path
		//ar << pPath->m_uType;
		fprintf(fp,"%d\n",pPath->m_uType);
		if(pPath->m_uType==0)
		{
		//	ar << pPath->m_uId
		//	<< pPath->m_uStartNode
		//	<< pPath->m_uEndNode
		//	<< pPath->m_fVeloLimit
		//	<< pPath->m_uGuideType
		//	<< pPath->m_uExtType
		//	<< ((CLinePath*) pPath)->m_uObstacle
		//	<< ((CLinePath*) pPath)->m_uHeading;
			if(ver==1)
			{
				fprintf(fp,"%d,	%d,	%d,	%f,	%d,	%d,	%d\n",pPath->m_uId,pPath->m_uStartNode,pPath->m_uEndNode,pPath->m_fVeloLimit,pPath->m_uGuideType,((CLinePath*) pPath)->m_uObstacle,((CLinePath*) pPath)->m_uHeading);
			}
			else
			{
				fprintf(fp,"%d,	%d,	%d,	%f,	%d,	%d,	%d,	%d\n",pPath->m_uId,pPath->m_uStartNode,pPath->m_uEndNode,pPath->m_fVeloLimit,pPath->m_uGuideType,pPath->m_uExtType,((CLinePath*) pPath)->m_uObstacle,((CLinePath*) pPath)->m_uHeading);
			}
		}
		else if(pPath->m_uType==1 || pPath->m_uType==2)
		{
		//	ar <<pPath->m_uId
		//   << pPath->m_uStartNode
		//	<< pPath->m_uEndNode
		//	<< pPath->m_fVeloLimit
		//	<< pPath->m_uGuideType
		//	<< pPath->m_uExtType
		//	<< ((CArcPath*) pPath)->m_uObstacle
		//	<< ((CArcPath*) pPath)->m_uHeading
		//	<< ((CArcPath*) pPath)->m_fCenterx
		//	<< ((CArcPath*) pPath)->m_fCentery
		//	<< ((CArcPath*) pPath)->m_uDirection;
			if(ver==1)
			{
				fprintf(fp,"%d,	%d,	%d,	%f,	%d,	%d,	%d,	%f,	%f,	%d\n",pPath->m_uId,pPath->m_uStartNode,pPath->m_uEndNode,pPath->m_fVeloLimit,pPath->m_uGuideType,((CLinePath*) pPath)->m_uObstacle,((CLinePath*) pPath)->m_uHeading,((CArcPath*) pPath)->m_fCenterx,((CArcPath*) pPath)->m_fCentery,((CArcPath*) pPath)->m_uDirection);
			}
			else
			{
				fprintf(fp,"%d,	%d,	%d,	%f,	%d,	%d,	%d,	%d,	%f,	%f,	%d\n",pPath->m_uId,pPath->m_uStartNode,pPath->m_uEndNode,pPath->m_fVeloLimit,pPath->m_uGuideType,pPath->m_uExtType,((CLinePath*) pPath)->m_uObstacle,((CLinePath*) pPath)->m_uHeading,((CArcPath*) pPath)->m_fCenterx,((CArcPath*) pPath)->m_fCentery,((CArcPath*) pPath)->m_uDirection);
			}
		}
	}
	fclose(fp);
}

void CPaintobjDoc::Create(CArchive& ar)
{
	int count;
	// Blank the node base if neccessary
	m_Objectsnode.RemoveAll();
	// Load the total number of nodes
	ar >> count;
	// Load the nodes data one by one
	for (USHORT i = 0; i < count; i++)
	{	m_pNode= new CNode;
		ar >> m_pNode->m_uId;
		ar>> m_pNode->m_uType;
		ar>> m_pNode->m_uExtType;
		ar>> m_pNode->x;
		ar>> m_pNode->y;
		ar>> m_pNode->m_fHeading;
		m_Objectsnode.Add(m_pNode);
		//delete m_pNode;				 
		m_pNode = NULL;
	}
	// Clear the old path base
	m_Objectspath.RemoveAll();	
	ar >> count;
	// Init the path objects one by one
	for (USHORT j = 0; j <count; j++)
	{
		CPath* pPath;
		USHORT uType;
		// First, load the type of path
		ar >> uType;
		// Init the other path object data, according to the path type
		if(uType==0)
		{
			pPath = new CLinePath;
			ar >> pPath->m_uId
			>> pPath->m_uStartNode
			>> pPath->m_uEndNode
			>> pPath->m_fVeloLimit
			>> pPath->m_uGuideType
			>> pPath->m_uExtType
			>> ((CLinePath*) pPath)->m_uObstacle
			>> ((CLinePath*) pPath)->m_uHeading;
			pPath->m_uType = uType;
			m_Objectspath.Add(pPath);
			//delete pPath;				 
			pPath = NULL;		
		}
		else if(uType==1)
		{
			pPath = new CArcPath;
			ar >>pPath->m_uId
		    >> pPath->m_uStartNode
			>> pPath->m_uEndNode
			>> pPath->m_fVeloLimit
			>> pPath->m_uGuideType
			>> pPath->m_uExtType
			>> ((CArcPath*) pPath)->m_uObstacle
			>> ((CArcPath*) pPath)->m_uHeading
			>> ((CArcPath*) pPath)->m_fCenterx
			>> ((CArcPath*) pPath)->m_fCentery
			>> ((CArcPath*) pPath)->m_uDirection;
			pPath->m_uType = uType;
			m_Objectspath.Add(pPath);
			//delete pPath;				 
			pPath = NULL;		
		}		
	}
}

void CPaintobjDoc::OnOutputSaveoutdata() 
{
	// TODO: Add your command handler code here
	GetData();
	//m_bSaveOutdata= TRUE;
	char szFilter[]="其它格式文件 (*.*)|*.*|地图数据文件 1.0 (*.bin1)|*.bin1|地图数据文件 2.0 (*.bin2)|*.bin2||";
	CMyFileDialog myfiledialog(FALSE, "", "world.bin1", 
	OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, 
	szFilter,
	AfxGetMainWnd());	
	myfiledialog.m_ofn.lpstrTitle="存储地图数据文件";
	if(myfiledialog.DoModal()==IDOK)
	{
		CString extname;
		myfiledialog.m_filetitle=myfiledialog.GetFileTitle();
		myfiledialog.m_fileextname=myfiledialog.GetFileExt();
		extname=myfiledialog.m_fileextname;
		extname.MakeLower();
		UINT ver=0;
		if(extname=="bin1")
		{
			ver=1;
		}
		else if(extname=="bin2")
		{
			ver=2;
		}
		else 
		{
			AfxMessageBox("请重新选择规定的数据文件格式,此次操作不成功!");
			return;
		}
		CString name=myfiledialog.m_filetitle+"."+myfiledialog.m_fileextname;
		CString name1=myfiledialog.m_filetitle+".txt";
		SaveText(name1,ver);//文本方式存储				
		CFile f;			
		if(!f.Open(name, CFile::modeCreate|CFile::modeWrite))
		{
			AfxMessageBox("打开文件不成功!");
			return;
		}
		CArchive ar1( &f, CArchive::store);	
		SaveBin(ar1,ver);//二进制方式存储	
		ar1.Close();
		f.Close();
	}
}

void CPaintobjDoc::OnToolClockwisearc() 
{
/*	// TODO: Add your command handler code here
	m_bZoomIn= FALSE;
	m_bZoomOut= FALSE;
	m_nSelectedTool = ID_TOOL_CLOCKWISEARC;
	GenerateTool();
*/
}

void CPaintobjDoc::OnToolAnticlockwisearc() 
{
/*	// TODO: Add your command handler code here
	m_bZoomIn= FALSE;
	m_bZoomOut= FALSE;
	m_nSelectedTool = ID_TOOL_ANTICLOCKWISEARC;
	GenerateTool();
*/
}

BOOL CPaintobjDoc::WriteClipBoard()
{
	int n_Num[2];//存放各图形元素的数量
	int n_Long[2];//每类图形元素形成的字符串长度
	LONG LongChar;//用来存放字符串总的长度
	char *p_Char;
	//double m_minx,m_miny,m_maxx,m_maxy;//用于得到插入基点
	double minx,miny;//用于得到插入基点
	//为剪裁板注册一个数据格式DrawFormat
	DrawFormat=::RegisterClipboardFormat("MyAppText");
	HGLOBAL HMem;
	char *pMem;
	n_Long[0]=125;//每个直线对象占用的字符串长度
	n_Long[1]=218;//每个圆弧对象占用的字符串长度
	n_Num[0]=0;
	n_Num[1]=0;
	//得到选中图形中各类图形元素的数目
	for(int i=0;i<m_nGraphSelect;i++)
		n_Num[GraphSelect[i].Type]++;

	LongChar=10+26;//存放图形元素的数目和插入基点坐标需要的字节
	//得到存放所有图形元素需要的字节
	for(i=0;i<2;i++)
		LongChar+=n_Long[i]*n_Num[i];
	//以下得到所有选中图形元素的矩形边界并得到插入基点
	for(i=0;i<m_nGraphSelect;i++)
	{	double minx1,miny1,maxx1,maxy1;
		CPainted*	pPainted;
		pPainted =GetShape(GraphSelect[i].Index);
		pPainted->GetBoundingRect(minx1,miny1,maxx1,maxy1);
		if(i==0)//如果是第一个图形元素
		{	minx=minx1;
			miny=miny1;		
		}
		else//不是第一个图形元素,比较得到插入基点
		{
			if(minx>minx1)	minx=minx1;
			if(miny>miny1)	miny=miny1;
		}	
	}
	//分配LongChar+1字节长的全局堆
	HMem=(char *)::GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE,LongChar+1);
	if(HMem==NULL)
		return FALSE;
	p_Char=new char[LongChar+1];//分配LongChar+1字节长的字符串
	if(p_Char==NULL)
	{
		HMem=0;
		return FALSE;
	}
	//将各图形元素数目转变成字符串并加入到p_Char中
	char p1[11];
	sprintf(p1,"%4d,%4d\n",n_Num[0],n_Num[1]);
	strcpy(p_Char,p1);
	//将插入基点坐标转变成字符串并加入到p_Char中
	char p2[27];	
	sprintf(p2,"%12.4f,%12.4f\n",minx,miny);
	lstrcat(p_Char,p2);
	//对各图形元素循环,调用各自toChar函数转变数据成员到字符串
	for(int j=0;j<2;j++)
	{
		for(i=0;i<m_nGraphSelect;i++)
		{
			CPainted*	pPainted;			
			if(GraphSelect[i].Type==0&&j==0)//直线
			{
				pPainted =GetShape(GraphSelect[i].Index);
				pPainted->toChar(p_Char);
			}
			else if(GraphSelect[i].Type==1&&j==1)//圆弧
			{
				pPainted =GetShape(GraphSelect[i].Index);
				pPainted->toChar(p_Char);
			}
		}
	}
	pMem=(char *)::GlobalLock(HMem);//锁定并得到全局内存块的字符指针
	if(pMem==NULL)
	{
		delete []p_Char;
		return FALSE;
	}
	::lstrcpy(pMem,p_Char);//将字符串拷贝到全局内存块
	::GlobalUnlock(HMem);//打开对句柄的锁定

⌨️ 快捷键说明

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