单文档
1)文档模板类将视图,框架,文档连接在一起
2)文档类doc
DeleteContents():这个虚函数,点击doc类。属性中 重写 添加就可以啦
做一些释放资源的操作,在每次新建 按钮之前,先调用此函数。
OnNewDocument():程序启动时第一次新建窗口调用时,会调用此函数,以后每次点击 新建都会调用此函数。
每次都是先DeleteContents 然后调用OnNewDocument()函数。
3)视图类 处理鼠标左键,右键
框架类是一个容器
程序功能:在单文档界面画椭圆,点击保存时能保存点的位置,点击新建时绘图消失,点击打开相应文件时,把之前的绘图显示出来。
知识点:
- 在DOC中
在.h中添加共有变量 CPoint m_pt[200];
int m_nNum;
在DeleteContents函数给上面两个变量初始化,如果有动态内存分配的,此时要释放内存 - 在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);
}