是很常见的。这使得编写访问文档变量的视图类的代码简单了一些。不过,这会使以后加强这个程序的功能时要做的工作增加。
像所有的文档数据一样,这个变量必须要初始化。这个工作在OnNewDocument( )函数中进行。在ClassView中扩展CFileDemoDoc,双击OnNewDocument( )编辑它。在其中添加一行初始化串的代码,如程序清单1所示。在此之前要把TODO注释删除掉。
程序清单1 初始化文档的数据
BOOL CFileDemoDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
m_message = 褼efault Message*;
return TRUE;
}
经过对文档类的数据成员m_message进行初始化,应用程序可以在视图窗口中显示该数据。你只须编辑视图类的OnDraw( )函数(参见程序清单2)。在ClassView中扩展CFileDemoView,并双击OnDraw( )函数编辑它。在这里也只要删除TODO注释,添加一行代码。
程序清单2 显示文档的数据
void CFileDemoView::OnDraw(CDC* pDC)
{
CFileDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOut(20, 20, pDoc->m_message);
}
现在创建File Demo应用程序,确保没有错误,运行这个程序。缺省的消息就显示在屏幕中。
现在,增加程序的功能允许程序员通过修改串值来编辑应用程序的文档。理论上说应用程序应该显示一个对话框,让用户输入字符串。在这儿,我们利用Edit|Change Message菜单项来自动赋给消息串一个不同的值。
单击Resource选项卡切换到ResourceView,扩展resources,扩展Menus,双击IDR_MAINFRAME,编辑它。单击菜单中的Edit项,下拉出一个子菜单列表。单击列表末尾的空白项并输入Change &Message,向菜单中添加了另外一项。
选择View|ClassWizard使得这个菜单项与代码相关联。先使ID_EDIT_ CHANGEMESSAGE 被中,再从右上角的下拉框中选择CFileDemoView 。在左下角的框中单击COMMAND,然后单击Add Function按钮。单击对话框的OK按钮,接受所推荐的函数名称-OnEditChangeMessage( )。单击Edit Code,在编辑器中打开这个新函数,按程序清单3编辑它。
程序清单3 修改文档的数据
void CFileDemoView::OnEditChangemessage()
{
CTime now = CTime::GetCurrentTime();
CString changetime = now.Format(褻hanged at %B %d %H:%M:%S*);
GetDocument()->m_message = changetime;
GetDocument()->SetModifiedFlag();
Invalidate();
}
此函数响应应用程序的Edit|Message命令,利用当前的日期和时间创建一个串,并将它传送给文档数据成员。对文档类函数SetModifiedFlag( )的调用通知对象其内容已经改变。在用户可能修改数据的地方调用SetModifiedFlag( ),就会使程序在用户试图不保存修改过的数据而退出时发出警告。最后,代码调用Invalidate( ),强迫屏幕重绘。
提示:如果m_message是文档类的私有成员变量,就应该用公共的SetMessage( )函数来调用SetModifiedFlag( )函数。这样每次m-message改变时,都会调用SetModifiedFlag()函数。这是编写真正的面向对象的程序的好处。
文档类的Serialize( )函数处理保存和加载文档的数据。程序清单4显示了由AppWizard生成的Serialize( )的空壳。
程序清单4 FILEVIEW.CPP—文档类的Serialize( )函数
void CFileDoc::Serialize(CArchive& ar)
{