文档/视图结构简介
文档函数
DeleteContents
OnNewDocument
OnOpenDocument
UpdateAllViews
视图函数
GetDocument
OnInitialUpdate
OnUpdate
OnDraw
对象的创建
模板对象
文档对象
框架对象
视图对象
各对象的关系
文档读写
文件的归档:CArchive
CArchive对象的使用
使类可串行化
串行化实现
范例
cpp
复制代码
void CModalDlg::OnButtonColor()
{
// TODO: Add your control notification handler code here
CColorDialog color;
if (color.DoModal() == IDOK)
{
CMainFrame* pMainFrm = (CMainFrame*)AfxGetMainWnd();//获取主窗口
//获取选定线条的颜色
CMFCTest10Doc* pDoc = (CMFCTest10Doc*)pMainFrm->GetActiveDocument();//获取活动文档对象
pDoc->m_color = color.GetColor();//设置文档中的线条颜色
}
}
cpp
复制代码
class CMFCTest10Doc : public CDocument
{
public:
UINT m_ulong;//长轴
UINT m_ushort;//短轴
UINT m_uthick;//线粗
COLORREF m_color;//线条颜色
CList<CPoint, CPoint> m_PointList;//点List
...
};
cpp
复制代码
BOOL CMFCTest10Doc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: 在此添加重新初始化代码
// (SDI 文档将重用该文档)
m_ulong = 20;//长轴
m_ushort = 20;//短轴
m_uthick = 2;//线粗
m_color = RGB(0, 150, 0);//线条颜色
return TRUE;
}
cpp
复制代码
void CMFCTest10Doc::DeleteContents()
{
// TODO: 在此添加专用代码和/或调用基类
m_PointList.RemoveAll();//删除所有数据
CDocument::DeleteContents();
}
cpp
复制代码
void CMFCTest10Doc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: 在此添加存储代码
ar << m_ulong << m_ushort << m_uthick << m_color;
}
else
{
ar >> m_ulong >> m_ushort >> m_uthick >> m_color;
// TODO: 在此添加加载代码
}
m_PointList.Serialize(ar);
}
cpp
复制代码
void CMFCTest10View::OnConfig()
{
// TODO: 在此添加命令处理程序代码
CMFCTest10Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CModalDlg dlg;
if (dlg.DoModal() == IDCANCEL)
{
return;
}
pDoc->DeleteContents();//删除文档内容
pDoc->m_ulong = dlg.m_ulong;
pDoc->m_ushort = dlg.m_ushort;
pDoc->m_uthick = dlg.m_uthick;
}
cpp
复制代码
void CMFCTest10View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CMFCTest10Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: Add your message handler code here and/or call default
CDC* pDc = GetDC();
CPen* pNewPen = new CPen;//创建画笔C++对象
pNewPen->CreatePen(PS_SOLID, pDoc->m_uthick, pDoc->m_color);//创建画笔
CPen* pOldPen = pDc->SelectObject(pNewPen);//选中当前画笔,并保存以前的画笔
pDc->Ellipse(point.x, point.y, point.x + pDoc->m_ulong, point.y + pDoc->m_ushort);//画圆
pDc->SelectObject(pOldPen);//恢复旧画笔
delete pNewPen;//删除新建的画笔对象
ReleaseDC(pDc);
pDoc->m_PointList.AddTail(point);
CView::OnLButtonDown(nFlags, point);
}
cpp
复制代码
void CMFCTest10View::OnDraw(CDC* pDC)
{
CMFCTest10Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
CPen* pNewPen = new CPen;//创建画笔C++对象
pNewPen->CreatePen(PS_SOLID, pDoc->m_uthick, pDoc->m_color);//创建画笔
CPen* pOldPen = pDC->SelectObject(pNewPen);//选中当前画笔,并保存以前的画笔
POSITION posi = pDoc->m_PointList.GetHeadPosition();
while (posi)
{
CPoint point(pDoc->m_PointList.GetNext(posi));
pDC->Ellipse(point.x, point.y, point.x + pDoc->m_ulong, point.y + pDoc->m_ushort);
}
pDC->SelectObject(pOldPen);//恢复旧画笔
delete pNewPen;//删除新建的画笔对象
}