对话框
模态对话框:用户在打开一个对话框如“打开文件”对话框后,在退出此对话框时无法在程序的其他地方工作。
非模态对话框:则可以。
对话数据交换和确认函数:DDX和DDV
文档与视图
文档对象容纳数据,而视图对象显示这些数据并允许编辑。
文档与视图的五个重要的成员函数:
CView::GetDocument():从视图得到与之相关联的文档。
CDocument::UpdateAllViews():当文档的数据发生改变时,通知(通过OnUpdate()函数)所有的视图更新所显示的数据。
CView::OnUpdate():当应用程序调用CDocument::UpdateAllViews()函数时,相应地调用该函数。
CView::OnInitialUpdate():程序启动时,或用户从File菜单选择New或Open时,便会调用此函数。如果视图类映射了OnCreate()函数,应用程序启动时调用OnCreate()之后立即调用OnInitialUpdate()。OnCreate()只调用一次,OnInitialUpdate()可调用多次。
CView::OnNewDocument():首次构造文档对象之后,且当用户从SDI应用程序的File菜单选择New的时候,调用此虚函数。在此函数内可设置文档数据成员的初始值。
文档的读写
序列化(Serialization):在程序退出时将对象保存到磁盘,可以程序重新启动时恢复它们。这个保存和恢复的过程称为序列化。但在MFC库中,不能使用序列化来替代数据库管理系统,虽然所有与文档有联系的对象都可以从一个磁盘文件中顺序读取,但不能随机访问磁盘文件中的对象。
注意:有一个称为结构化存储的可适应顺序文件和数据库。MFC框架就已经使用结构化存储,支持嵌入对象的包容器程序。
永久保存 (Persistence):保存应用程序的各种信息。
CArchive:为序列化提供一个上下文。CArchive可以看成文档与磁盘文件之间的媒介,构造Archive对象时,将一个CFile对象与其连接在一起;Serailize()函数以CArchive的引用为参数,程序开发人员只要完成对Archive的序列化操作,与磁盘之间的交换由Archive去完成。一个CArchive对象可以写或读数据,但不能同时读写。
CFile:代表存储在磁盘介质上的文件,直接支持非缓冲文件和二进制文件读写,其派生类支持文本文件和内存文件。当有读写命令时,应用程序框架打开文件并完成CFile与CArchive对象的连接,然后将CArchive对象的引用作为参数传给CDocument::Serialize(),所以在AppWizard产生的代码中甚至看不到CFile对象。
序列化的过程如下:
图:序列化过程
我们要做的就是在Serialize()中,将数据存到归档对象中,或者从归档对象中取出。在File Open和File Save过程中,应用程序框架调用文档的Serialize()函数。
文件扩展名及打开方式
双击打开
在第一次运行AppWizard时,在第四步对话框中单击Adavanced按钮,在对话框左上方控件中输入文件名的扩展名。这样可以确保文档模板资源字符串包含正确的默认文件扩展名,并在应用程序类的InitInstance()中插入与资源管理器有关的代码,使用户可以双击文档图标来运行打开文档的程序(exe)。
//Enable DDE Execute open
EnableShellOpen();
RegisterShellFileTypes(TRUE);
如果在AppWizard中为做设置,可以在WorkSpace中选择Resource View页面,打开String Table资源,选择ID为IDR_MAINFRAME的字符串,双击它,打开String Properties对话框,在Caption编辑框中显示类似的下列信息:
标题栏My16b/n我的无标题/nMy16b/n/n.17a/nMy16b.Document/n 17a Document
每个字符串由/n分隔,/n后无字符串标识字符串为空。七个字符串的含义如下:
标题栏My16b是应用程序主窗口标题栏显示内容,仅SDI需要
/n我的无标题文档名,作为新建文档的缺省名。如此串为空,使新文档窗口标题栏显示”无标题”
/nMy16b只与MDI有关,当有多个文档模板时,作为文档模板名
/n(null) 显示在文件对话框文件类型列表框中的信息如文件 (* .17a ) ”
/n .17a 缺省的文件后缀,如“* .17a ”
/nMy16b.Document注册表中使用的文件类型子项名
/n 17a Document注册表中使用的文件类型名
其中第四、五个字符串与文件类型有关。对第四个字符串资源修改为行尾的字符串 17a 后,打开文件对话框会自动显示文件类型*. 17a 。
拖放打开
在应用程序类的InitInstance()中插入与资源管理器有关的代码,使用户可以拖放文档图标到以运行的程序(exe)来打开文档。
//Enable drag/drop open
m_pMainWnd->DragAcceptFiles();