<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0041)http://www.vczx.com/tutorial/mfc/mfc5.php -->
<HTML><HEAD><TITLE>MFC教程_ MFC对象的创建</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2900.3157" name=GENERATOR></HEAD>
<BODY bgColor=#ffffff>
<P align=justify>
<LI><A name=_Toc445889035></A><A name=_Toc445782438></A><A
name=_Toc452640914></A><A name=_Toc457298997></A><B>MFC对象的创建</B>
<P></P>
<P
align=justify>前面几章介绍了MFC的核心概念和思想,即介绍了MFC对Windows对象的封装方法和特点;MFC对象的动态创建、序列化;MFC消息映射机制。</P>
<P align=justify>现在,考查MFC的应用程序结构体系,即以文档-视为核心的编程模式。学习本章,应该弄清楚以下问题:</P>
<P align=justify>MFC中诸多MFC对象的关系:应用程序对象,文档对象,边框窗口对象,文档边框窗口对象,视对象,文档模板对象等。</P>
<P align=justify>MFC对象的创建和销毁:由什么对象创建或销毁什么对象,何时创建,何时销毁?</P>
<P align=justify>MFC提供了那些接口来支持其编程模式?</P>
<OL>
<P align=justify>
<LI><A name=_Toc445889036></A><A name=_Toc445782439></A><A
name=_Toc452640915></A><A name=_Toc457298998></A><B>MFC对象的关系</B>
<P></P>
<OL>
<P align=justify>
<LI><B><A name=_Toc445889037></A><A name=_Toc445782440></A><A
name=_Toc452640916></A><A name=_Toc457298999></A>创建关系</B>
<P></P><B><IMG height=187 hspace=12 src="mfc5.files/image118.gif" width=288
align=left> </B>
<P
align=justify>这里讨论应用程序、文档模板、边框窗口、视、文档等的创建关系。图5-1大略地表示了创建顺序,但表5-1更直接地显示了创建与被创建的关系。</P>
<P align=justify> </P>
<P align=center>表5-1 MFC对象的创建关系</P>
<TABLE cellSpacing=1 cellPadding=7 width=497 border=1>
<TBODY>
<TR>
<TD vAlign=top width="47%">
<P align=justify>创建者 </P></TD>
<TD vAlign=top width="53%">
<P align=justify>被创建的对象 </P></TD></TR>
<TR>
<TD vAlign=top width="47%">
<P align=justify>应用程序对象 </P></TD>
<TD vAlign=top width="53%">
<P align=justify>文档模板 </P></TD></TR>
<TR>
<TD vAlign=top width="47%">
<P align=justify>文档模板 </P></TD>
<TD vAlign=top width="53%">
<P align=justify>文档 </P></TD></TR>
<TR>
<TD vAlign=top width="47%">
<P align=justify>文档模板 </P></TD>
<TD vAlign=top width="53%">
<P align=justify>边框窗口 </P></TD></TR>
<TR>
<TD vAlign=top width="47%">
<P align=justify>边框窗口 </P></TD>
<TD vAlign=top width="53%">
<P align=justify>视 </P></TD></TR></TBODY></TABLE>
<P align=center> </P>
<P align=justify></P>
<LI><A name=_Toc445889038></A><A name=_Toc445782441></A><A
name=_Toc452640917></A><A name=_Toc457299000></A><B>交互作用关系</B>
<P></P></LI></OL>
<P
align=justify>应用程序对象有一个文档模板列表,存放一个或多个文档模板对象;文档模板对象有一个打开文档列表,存放一个或多个已经打开的文档对象;文档对象有一个视列表,存放显示该文档数据的一个或多个视对象;还有一个指针指向创建该文档的文档模板对象;视有一个指向其关联文档的指针,视是一个子窗口,其父窗口是边框窗口(或者文档边框窗口);文档边框窗口有一个指向其当前活动视的指针;文档边框窗口是边框窗口的子窗口。</P>
<P align=justify>Windows 管理所有已经打开的窗口,把消息或事件发送给目标窗口。通常,命令消息发送给主边框窗口。</P><IMG
height=249 hspace=12 src="mfc5.files/image119.gif" width=393 align=left>
<P align=justify>图5-2大略地表示了上述关系:</P>
<P align=justify></P>
<P align=justify>MFC提供了一些函数来维护这些关系。</P>
<P align=justify>表5-2列出了从一个对象得到相关对象的方法。</P>
<P align=center>表5-2 从一个对象得到另一个对象的方法</P>
<TABLE cellSpacing=1 cellPadding=7 width=497 border=1>
<TBODY>
<TR>
<TD vAlign=top width="29%">
<P align=center>本对象 </P></TD>
<TD vAlign=top width="27%">
<P align=center>要得到的对象 </P></TD>
<TD vAlign=top width="44%">
<P align=justify>使用的成员函数 </P></TD></TR>
<TR>
<TD vAlign=top width="29%" rowSpan=2>
<P align=justify>CDocument对象 </P></TD>
<TD vAlign=top width="27%">
<P align=justify>视列表 </P></TD>
<TD vAlign=top width="44%">
<P align=justify>GetFirstViewPosition</P>
<P align=justify>GetNextView </P></TD></TR>
<TR>
<TD vAlign=top width="27%">
<P align=justify>文档模板 </P></TD>
<TD vAlign=top width="44%">
<P align=justify>GetDocTemplate </P></TD></TR>
<TR>
<TD vAlign=top width="29%" rowSpan=2>
<P align=justify>CView对象 </P></TD>
<TD vAlign=top width="27%">
<P align=justify>文档对象 </P></TD>
<TD vAlign=top width="44%">
<P align=justify>GetDocument </P></TD></TR>
<TR>
<TD vAlign=top width="27%">
<P align=justify>边框窗口 </P></TD>
<TD vAlign=top width="44%">
<P align=justify>GetParentFrame </P></TD></TR>
<TR>
<TD vAlign=top width="29%" rowSpan=2>
<P align=justify>CMDIChildWnd或</P>
<P align=justify>CFrameWnd对象 </P></TD>
<TD vAlign=top width="27%">
<P align=justify>活动视 </P></TD>
<TD vAlign=top width="44%">
<P align=justify>GetActiveView </P></TD></TR>
<TR>
<TD vAlign=top width="27%">
<P align=justify>活动视的文档 </P></TD>
<TD vAlign=top width="44%">
<P align=justify>GetActiveDocument </P></TD></TR>
<TR>
<TD vAlign=top width="29%">
<P align=justify>CMDIFrameWnd对象 </P></TD>
<TD vAlign=top width="27%">
<P align=justify>活动文档边框窗口 </P></TD>
<TD vAlign=top width="44%">
<P align=justify>MDIGetActive </P></TD></TR></TBODY></TABLE>
<P align=center> </P>
<P align=center>表5-3 从一个对象通知另一个对象的方法:</P>
<TABLE cellSpacing=1 cellPadding=7 width=497 border=1>
<TBODY>
<TR>
<TD vAlign=top width="31%">
<P align=justify>本对象 </P></TD>
<TD vAlign=top width="30%">
<P align=justify>要通知的对象/动作 </P></TD>
<TD vAlign=top width="39%">
<P align=justify>使用的成员函数 </P></TD></TR>
<TR>
<TD vAlign=top width="31%">
<P align=justify>CView对象 </P></TD>
<TD vAlign=top width="30%">
<P align=justify>通知文档更新所有视 </P></TD>
<TD vAlign=top width="39%">
<P align=justify>CDocument::UpdateAllViews </P></TD></TR>
<TR>
<TD vAlign=top width="31%">
<P align=justify>CDocument对象 </P></TD>
<TD vAlign=top width="30%">
<P align=justify>更新一个视 </P></TD>
<TD vAlign=top width="39%">
<P align=justify>CView::OnUpdate </P></TD></TR>
<TR>
<TD vAlign=top width="31%" rowSpan=2>
<P align=justify>CFrameWnd或</P>
<P align=justify>CMDIFrameWnd对象 </P></TD>
<TD vAlign=top width="30%">
<P align=justify>通知一个视为活动视 </P></TD>
<TD vAlign=top width="39%">
<P align=justify>CView::OnActivateView </P></TD></TR>
<TR>
<TD vAlign=top width="30%">
<P align=justify>设置一个视为活动视 </P></TD>
<TD vAlign=top width="39%">
<P align=justify>SetActivateView </P></TD></TR></TBODY></TABLE>
<P align=justify></P>
<P
align=justify>可以通过表5-2得到相关对象,再调用表5-3中相应的函数。例如:视在接受了新数据或者数据被修改之后,使用表5-2中的函数GetDocument得到关联文档对象,然后调用表5-3中的文档函数UpdateAllViews更新其他和文档对象关联的视。</P>
<P
align=justify>在表5-2和表5-3中,CView对象指CView或派生类的实例;成员函数列中如果没有指定类属,就是第一列对象的类的成员函数。</P>
<P align=justify></P>
<LI><A name=_Toc445889039></A><A name=_Toc445782442></A><A
name=_Toc452640918></A><A name=_Toc457299001></A><B>MFC提供的接口</B>