MFC单文档打开文件

news/2024/7/8 5:17:17 标签: 文档, mfc, command, file, 图形, 框架

打开文件类之间关联

在向导创建的应用程序中,程序的默认菜单有“文件”、“编辑”、“视图”和“帮助”。当运行程序后,打开“文件”菜单中的“打开”命令时,应用程序会自动打开相应的“打开”文件通用对话框。之所以有这功能,是因为向导创建的应用程序框架中,自动将“打开”菜单命令与CWinApp的OnFileOpen成员函数相关联。

当用户在通用“打开”文件对话框中指定一个文件后,应用程序将调用文档对象的CDocument::OnOpenDocument虚成员函数。该函数将打开文件,并调用DeleteContents清除文档对象的内容,然后创建一个CArchive(归档类)对象用于数据的读取,接着又自动调用Serialize函数。之后便调用视图对象的CView::OnInitialUpdate虚成员函数。

上述的Serialize函数是一个很特别的函数,它既可以从中读取文档数据,也可以保存文档数据,称为“序列化”函数。它被添加用户的文档类中,用来根据CArchive内部的一个标志来决定文档数据的流向(读或写),

 

    打开机制:可以看到消息映射ON_COMMAND(ID_FILE_OPEN,CWinApp::OnFileOpen),如果你没有映射ID_FILE_OPEN消息,就会调用CWinApp::OnFileOpen,否则调用你的消息映射函数。在CWinApp::OnFileOpen中调用CDocManager::OnFileOpen(),这样函数完成以下任务:1。弹出对话框让用户选择待打开的文件,返回该文件的全路径名称,   供下面函数调用时使用2。调用应用程序的OpenDocumentFile(LPCTSTR   lpszFileName)。至此,这个对话框的出处就真相大白了。 

 

文档数据的读操作

对于上述过程,我们所做的仅仅是在文档类的Serialize函数中添加文档数据读取(加载)和存储的代码。需要说明的是,Serialize函数的参数ar是一个CArchive类的引用对象。CArchive类提供了“<<”和“>>”运算符,分别可以向文档对象写入数据或从文档对象中读取数据。它们的含义与C++中的“<<”和“>>”运算符相同,只不过CArchive支持更多的数据类型,如:CObject、CString等。除此之外CArchive类还提供ReadString和WriteString成员函数来读写文档中的一行文本。

 

文档数据的显示方法和技巧

用户的视图类是负责显示文档数据的,目前常用的显示方法有二个:一是在视图的客户区中使用编辑控件,二是直接调用CDC类的文本输出函数绘制所有的文本内容。

1.    使用编辑控件

“编辑控件”是一个可以让用户从键盘输入和编辑文本的控件,通过它可以输入各种文本、数字或者口令,也可使用它来编辑和修改简单的文本内容。MFC类CEdit封装了编辑控件的全部操作。

使用编辑控件实现文档数据的显示的思路是,先在视图中创建一个与视图客户区大小相同的编辑控件,然后把文档的文本内容转送到编辑控件中。

 

2.       直接控制文本的输出(详细)

 

(1)重写OnOpenDocument函数,读取文本文件到字符串变量

BOOL CMFCDoc::OnOpenDocument(LPCTSTR lpszPathName)

{

     if (!CDocument::OnOpenDocument(lpszPathName))

         return FALSE;

     // TODO:  在此添加您专用的创建代码

    if(lpszPathName!=NULL) 

     {   

         CFile pCFile;

         int hResult=pCFile.Open(lpszPathName, CFile::modeReadWrite); //以读写方式打开文件

        if(hResult != 0)

         {

     //       AfxMessageBox("打开文件成功");

         }

     //将文件读到str字符串

pCFile.Read(str.GetBuffer(pCFile.GetLength()), pCFile.GetLength()); 

        pCFile.Close();

    

     }

     return TRUE;

}

(2)ondraw函数中将文件显示出来

CDC为我们提供了四个输出文本的函数:TextOut、ExtTextOut、TabbedTextOut和DrawText,分别用于不同的场合。如果想要绘制的文本需要支持Tab符,那么采用TabbedTextOut函数,可以使绘制出来的文本效果更佳;如果要在一个矩形区域内绘制多行文本,那么采用DrawText函数,会更富于效率;如果文本和图形结合紧密,字符间隔不等,并要求有背景颜色或矩形裁剪特性,那么ExtTextOut函数就将是最好的选择。如果没有什么特殊要求,那使用TextOut函数就显得简练了。

 

  pDC->DrawText(pDoc->str,pDoc->str.GetAllocLength(),CRect(0,0,1000,1000),DT_WORDBREAK);


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/juefeiYE/archive/2010/03/31/5435916.aspx

 

我的关注点:CArchive类,CDocument类将文件打开后实际是存在此类的实例中的,所以在意。


http://www.niftyadmin.cn/n/739383.html

相关文章

MySQL数据库中order by的实现 和 by rand() 和优化

转载自淘宝丁奇&#xff01;有同学上周问了个问题 “MySQL数据库里面的order by rand()”是怎么实现的。我们今天来简单说说MySQL数据库里的order by。几种order by的情况 乍一看这个问题好像有点复杂&#xff0c;我们从最简单的case开始看起。 用这个表来说明&#xf…

static关键字-void和void指针-函数指针

static关键字1&#xff0e;作用于变量&#xff1a; 用static声明局部变量-------局部变量指在代码块{}内部定义的变量&#xff0c;只在代码块内部有效&#xff08;作用域&#xff09;&#xff0c;其缺省的存储方式是自动变量或说是动态存储的&#xff0c;即指令执行到变量定义…

linux下安装protobuf教程+示例(详细)

1 在网站 http://code.google.com/p/protobuf/downloads/list上可以下载 Protobuf 的源代码。然后解压编译安装便可以使用它了。 安装步骤如下所示&#xff1a;tar -xzf protobuf-2.1.0.tar.gz cd protobuf-2.1.0 ./configure --prefix/usr/local/protobufmake make check make…

说说JSON和JSONP,也许你会豁然开朗,含jQuery用例

简单来说&#xff1a;JSON是一种数据交换格式&#xff0c;而JSONP是JSON的一种使用模式&#xff0c;是基于JSON的 简单说就是JSON是协议&#xff0c;而JSONP是使用这种协议的一种方法 前言&#xff1a; 由于Sencha Touch 2这种开发模式的特性&#xff0c;基本决定了它原生的数据…

c语言中volatile关键字

volatile关键字是一种类型修饰符&#xff0c;用它声明的类型变量表示可以被某些编译器未知的因素更改。 用volatile关键字声明的变量i每一次被访问时&#xff0c;执行部件都会从i相应的内存单元中取出i的值。 没有用volatile关键字声明的变量i在被访问的时候可能直接从cpu的寄存…

深入理解sizeof

深入理解sizeof作者&#xff1a;房秉毅 最近在论坛里总有人问关于sizeof的问题&#xff0c;并且本人对这个问题也一直没有得到很好的解决&#xff0c;索性今天对它来个较为详细的总结&#xff0c;同时结合strlen进行比较&#xff0c;如果能对大家有点点帮助&#xff0c;这是我最…

Web service是什么?

原文链接&#xff1a; http://www.ruanyifeng.com/blog/2009/08/what_is_web_service.html 作者&#xff1a; 阮一峰 日期&#xff1a; 2009年8月26日 我认为&#xff0c;下一代互联网软件将建立在Web service&#xff08;也就是"云"&#xff09;的基础上。 我把学习…

C/C++经典排序算法

排序算法是一种基本并且常用的算法。由于实际工作中处理的数量巨大&#xff0c;所以排序算法对算法本身的速度要求很高。 而一般我们所谓的算法的性能主要是指算法的复杂度&#xff0c;一般用O方法来表示。在后面我将给出详细的说明。 对于排序的算法我想先做一点简单的…