MFC-Serialization序列化保存、打开线段和多段线

题目描述:

现有实体line和polyline,需要将这些实体序列化输入和输出,通过对话框保存和打开。

一、保存模型数据(序列化)

void CEncloseAreaDlg::OnBnClickedButtonSavedata()
{
	// TODO: 在此添加控件通知处理程序代码
	if (!m_bFilePath)
	{
		AfxMessageBox(_T("请您先导入数据!"));
		return;
	}

	// 设置过滤器   
	TCHAR szFilter[] = _T("midas XD Files(*.gdb)||");    
	// 构造保存文件对话框   
	 CFileDialog fileDlg(FALSE, _T("gdb"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, this);    

	 CString strFilePath;   
	 if (IDOK == fileDlg.DoModal())   
	 {
		 strFilePath = fileDlg.GetPathName();

		 CFile file;
		 file.Open(strFilePath, CFile::modeCreate | CFile::modeWrite);
		 CArchive ar(&file, CArchive::store);
		 CDataDB* pDB = CDataDB::GetInstance();
		 pDB->Serialize(ar);

		 ar.Close();
	 }
	
}

二、打开模型数据(序列化)

void CEncloseAreaDlg::OnBnClickedButtonOpendata()
{
	// TODO: 在此添加控件通知处理程序代码
	// 设置过滤器   
	TCHAR szFilter[] = _T("midas XD Files(*.gdb)||");  
	// 构造打开文件对话框   
	CFileDialog fileDlg(TRUE, _T("gdb"), NULL, 0, szFilter, this);   
	CString strFilePath;   
	CDataDB* pDB = CDataDB::GetInstance();
	// 显示打开文件对话框   
	if (IDOK == fileDlg.DoModal())   
	{   
		// 如果点击了文件对话框上的“打开”按钮,则将选择的文件路径显示到编辑框里   
		strFilePath = fileDlg.GetPathName();   
		CFile file;
		file.Open(strFilePath, CFile::modeRead);
		CArchive ar(&file, CArchive::load);
		
		pDB->Serialize(ar);

		ar.Close();
		file.Close();
	}   

	//绘制模型
	CWnd *pwnd = GetDlgItem(IDC_STATIC_TESTMODEL);
	CDC *pDC = pwnd->GetDC();
	pwnd->Invalidate();
	pwnd->UpdateWindow();

	pDC->Rectangle(0, 0, 400, 400);

	CPen *ppenRed = new CPen;

	ppenRed->CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
	CGdiObject *pOldpen = pDC->SelectObject(ppenRed);

	//绘制直线
	int nLineNum = pDB->getLineNum();
	for (int i=0;i<nLineNum;i++)
	{
		CLine line = pDB->GetLine(i);
		line.draw(pDC);
	}

	//绘制多段线
	vector<CPolyline> PolylineVector = pDB->GetPolylineVector();
	for (unsigned int i = 0;i < PolylineVector.size(); i++)
	{
		PolylineVector[i].draw(pDC);
	}
	

}

三、在存放实体的类中书写序列化的method


void CDataDB::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		size_t num = m_LineVector.size();
		ar << num;
		for (size_t i = 0;i < num; i++)
		{
			m_LineVector[i].Serialize(ar);
		}

		num = m_PolylineVector.size();
		ar << num;
		for (size_t j = 0;j < num;j++)
		{
			m_PolylineVector[j].Serialize(ar);
		}
	}
	else
	{
		int num = 0;
		ar >> num;
		for (int i = 0;i < num;i++)
		{
			CLine line;
			line.Serialize(ar);
			AddLine(line);
		}

		ar >> num;
		for (int j = 0;j < num; j++)
		{
			CPolyline polyline;
			polyline.Serialize(ar);
			AddPolyline(polyline);
		}
	}
		
}

四、类CLine中添加序列化的method


void CLine::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		CPoint2D ptStart = getStartPoint();
		CPoint2D ptEnd = getEndPoint();
		ptStart.Serialize(ar);
		ptEnd.Serialize(ar);	
	}	
	else
	{
		CPoint2D ptStart;
		CPoint2D ptEnd;
		ptStart.Serialize(ar);
		ptEnd.Serialize(ar);
		setPoints(ptStart,ptEnd);
	}
}

五、类CPolyine中添加序列化的method


void CPolyline::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		vector<CPoint2D> points = getPoints();
		size_t num = points.size();
		ar << num;
		for (size_t i = 0; i<num;i++)
		{
			points[i].Serialize(ar);
		}
	}	
	else
	{
		size_t num = 0;
		ar >> num;
		for (size_t i = 0; i<num;i++)
		{
			CPoint2D pt;
			pt.Serialize(ar);
			addPoint(pt);
		}
	}
}

六、在类Point中添加序列化的method


void CPoint2D::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
		ar << x << y;
	else
		ar >> x >> y;
}

七、效果:

导入实体后,通过序列化的方式存储数据,打开文本后可以看到是以二进制的方式存储的。然后使用打开按钮打开这个二进制文本,并使用这个文本中的数据绘制图形。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值