基于单文档的绘图及绘图结果保存

单文档
1)文档模板类将视图,框架,文档连接在一起
2)文档类doc
DeleteContents():这个虚函数,点击doc类。属性中 重写 添加就可以啦
做一些释放资源的操作,在每次新建 按钮之前,先调用此函数。
OnNewDocument():程序启动时第一次新建窗口调用时,会调用此函数,以后每次点击 新建都会调用此函数。

每次都是先DeleteContents 然后调用OnNewDocument()函数。
3)视图类 处理鼠标左键,右键
框架类是一个容器

程序功能:在单文档界面画椭圆,点击保存时能保存点的位置,点击新建时绘图消失,点击打开相应文件时,把之前的绘图显示出来。
知识点:

  1. 在DOC中
    在.h中添加共有变量 CPoint m_pt[200];
    int m_nNum;
    在DeleteContents函数给上面两个变量初始化,如果有动态内存分配的,此时要释放内存
  2. 在View中
    鼠标左键按下: 刷新doc类中变量和点坐标的值,并用invalidate刷新绘图
    在OnDraw中 绘图
    3.保存与打开上次坐标数据 :
    点击点击保存按钮:利用doc中Serialize 中ar << m_nNum; 将数据保存
    打开:ar >> m_nNum; 就会有绘图啦
//Doc.h
public:
	CPoint m_pt[200];
	int m_nNum;
	virtual void DeleteContents();
//Doc.cpp

// CArchivePro01Doc 序列化

void CArchivePro01Doc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: 在此添加存储代码
		ar << m_nNum;
		for (int i = 0;i < m_nNum;i++)
		{
			ar << m_pt[i];//cout功能
		}
	}
	else
	{
		// TODO: 在此添加加载代码
		ar >> m_nNum;
		for (int i = 0;i < m_nNum;i++)
		{
			ar >> m_pt[i];
		}
	}
}


void CArchivePro01Doc::DeleteContents()
{
	// TODO: 在此添加专用代码和/或调用基类
	//单文档初始化在此处哦
	memset(m_pt,0,sizeof(m_pt));
	m_nNum = 0;
	CDocument::DeleteContents();
}

在视图类中
添加WM_LBUTTONDOWN消息

void CArchivePro01View::OnDraw(CDC* pDC)
{
	CArchivePro01Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 在此处为本机数据添加绘制代码
	for (int i = 0;i < pDoc->m_nNum;i++)
	{
		pDC->Ellipse(pDoc->m_pt[i].x - 5, pDoc->m_pt[i].y - 5
			, pDoc->m_pt[i].x + 5, pDoc->m_pt[i].y + 5);
	}
}


void CArchivePro01View::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CArchivePro01Doc * pDoc = GetDocument();
	if (pDoc->m_nNum > 200)
	{
		pDoc->m_nNum = 200;
		return;
	}
	pDoc->m_pt[pDoc->m_nNum] = point;
	pDoc->m_nNum++;

	//开始会提就可以啦
	Invalidate();//OnDraw调用绘图

	CView::OnLButtonDown(nFlags, point);
}

你可能感兴趣的:(MFC)