(第四版中文版)[十六]读和写文档-SDI应用程序:序列化,双击运行程序,拖放运行,快捷方式的实现

来源:互联网 发布:应采儿长相知乎 编辑:程序博客网 时间:2024/05/16 17:51

 序列化:

即对象可以被持续。意即当程序退出时,文档被存在磁盘上,当程序重启时又可以恢复。对象的这种存盘和恢复的过程即称为序列化。

磁盘文件和归档:

Serialize函数对数据进行的读和写:在MFC中,磁盘文件是通过CFile类的对象来表示,CFile类对通过Win32函数CreateFile所获得的二进制文件句柄进行了封装。该文件句柄和通过调用C运行库fopen函数所获得的带缓冲区的FILE指针有所不同,它是一个二进制文件的句柄,应用程序框架借助于该文件句柄来调用win32函数ReadFile、WriteFile、SetfilePointer。如果应用程序不直接利用磁盘I/O,而只依赖于序列化处理过程,那么可以避免直接使用CFile对象。在Serialize函数和CFile对象之间,还有一个归档对象(CArchive类对象)。该归档对象为CFile对象缓存数据,它同时还保存一个内部标记,用来标识归档是存入还是载入。在FileOPen和FileSave的处理过程中会调用文档的Serialize函数。

可序列化的类必须直接或间接地从CObject派生而来,并在声明中必须包含DECLARE_SERIAL宏调用,在类的实现文件中,必须包含IMPLEMENT_SERIAL宏调用。

大多数序列化函数都需要调用基类的Serialize函数。

从归档中载入-内嵌对象和指针:

对于CObjecf 派生类的内嵌对象总是直接调用 Serialize()。

从Explorer启动和拖放(双击文档能运行某个程序来打开):

在 InitInstance() 里调用

    RegisterShellFileType(TRUE) ;

在注册表里会加入两个条目:

  HKEY_CLASSES_ROOT顶层键下,新加入一个子键和一个数据字符串。

在文档上双击:

InitInstance()  里的 EnableShellOpen() ;

它支持通过DDE消息执行程序。

允许拖放:

  应用程序对象的公有数据成员m_pMainWnd指针指向CFrameWnd(或CMDIFrameWnd)对象。当把一个文件拖到框架窗口里的任何地方时,都会激发对CFrameWnd::OnDropFiles 的调用。AppWizard 在 InitInstance() 里产生一行代码,使拖放可以工作:

    m_pMainWnd->DragAcceptFiles() ;

程序启动参数:

  InitInstance() 函数调用 ParseCommandLine 和 ProcessShellCommand()  函数以处理命令行。如果命令行包含一些看起来像文件名一样的字符,程序会马上装入该文件。因此可以建立一个Windows快捷方式以用指定的文档文件运行程序。

原创粉丝点击