介绍
文档模板类(CDocTemplate)将视图类(CView)、框架类(CFrameWnd)和文档类(CDocument)捆绑在一起。文档模板将类型消息在注册表中进行注册,使得在双击文档类型的文件时,操作系统根据注册信息找到执行文件启动进程并加载该文档。
实例
创建一个简单版画图软件。
1.创建一个多文档项目,选择文档/视图架构支持;
2.在向导页中填写文档拓展名:md;设置项目类型为“标准MFC”;选择静态链接库;在向导页最后一页,选择CScrollView作为视图类;
3.在资源视图中编辑工具栏资源,添加其ID;
4.添加一个普通类CLayer,修改其头文件,使其成为一个抽象类(=0)。
5.添加CLayer的派生类,用于不同形状的绘制图层。如CRectan。
6.修改所有基类中的虚函数(去掉=0)并添加成员变量,编写成员函数代码。
void CRectan::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
ar<<m_rect;
}
else
{
ar>>m_rect;
}
}
void CRectan::OnLButtonDown(UINT nFlags,CPoint point)
{
m_rect.left=point.x;
m_rect.top=point.y;
//按下鼠标时,以该点作为矩形左上角
}
void CRectan::OnMouseMove(UINT nFlags,CPoint point,CDC* pDC)
{
if (!(nFlags & MK_LBUTTON))
{
return;
}
//如果移动鼠标的同时,鼠标左键处于按下状态
pDC->SetROP2(R2_NOT);//两次取反绘图就可以擦去不需要的过程图像
pDC->SelectStockObject(NULL_BRUSH);
if (m_rect.right>=0)
{
pDC->Rectangle(m_rect);//擦除上一次绘制的图形
}
m_rect.right=point.x;
m_rect.bottom=point.y;
pDC->Rectangle(m_rect);//绘制图形
}
void CRectan::OnLButtonUp(UINT nFlags,CPoint point)
{
//松开鼠标时,以该点作为矩形的右下角坐标
m_rect.right=point.x;
m_rect.bottom=point.y;
m_rect.NormalizeRect();
}
void CRectan::OnDraw(CDC *pDC)
{//用于每次界面的更新
pDC->Rectangle(m_rect);
if (STU_SELECT==m_nStatus)
{
pDC->FillSolidRect(m_rect.left-3,m_rect.top-3,6,6,GetSysColor(COLOR_HIGHLIGHT));
pDC->FillSolidRect(m_rect.right-3,m_rect.top-3,6,6,GetSysColor(COLOR_HIGHLIGHT));
pDC->FillSolidRect(m_rect.left-3,m_rect.bottom-3,6,6,GetSysColor(COLOR_HIGHLIGHT));
pDC->FillSolidRect(m_rect.right-3,m_rect.bottom-3,6,6,GetSysColor(COLOR_HIGHLIGHT));
}
}
7.修改CLayer类的源文件,添加Create函数的代码,用于创建不同图形的类对象。
8.修改CmdView类的头文件,添加成员变量,修改初始化函数;为工具项添加消息映射函数,用于显示选择状态。
9.在CDoc类中添加管理图层信息的成员变量。
10.在CmdView类中添加鼠标的消息映射函数;修改OnDraw函数;内嵌派生类的函数。
11.在CmdDoc类中修改序列化函数,内嵌派生类的序列化函数;添加虚函数DeleteContents,用于关闭文档时清理内存。
解释画橡皮线的原理的博文:http://blog.csdn.net/zyq11223/article/details/8271006?locationNum=15