📄 learnvc.html
字号:
</DIR>
</DIR>
</DIR>
</DIR>
</DIR>
</DIR>
</DIR>
</DIR>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P>在图</FONT><FONT SIZE=3>1.15</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>这个对话框,在这个对话框中选中一种资源类型,比如选择</FONT><FONT SIZE=3>CURSOR</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类型,然后单击</FONT><FONT SIZE=3>NEW</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>按钮。在左边的工作区中就出现了我们新生成的资源的标识符,双击这个标识符,在右边的工作区中就可以对这个新的指针形状资源进行可视化编辑了。如图</FONT><FONT SIZE=3>1.16</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
<P ALIGN="JUSTIFY">通过这部分内容的介绍,相信您已经对使用</FONT><FONT SIZE=3>VISUAL C++</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>开发</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序的</P><DIR>
<DIR>
<P ALIGN="CENTER"><IMG SRC="Image20.gif" WIDTH=456 HEIGHT=342>图</FONT><FONT SIZE=3>1.16</P></DIR>
</DIR>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P>基本步骤有了认识。在下一章的内容当中,我们将结合</FONT><FONT SIZE=3>WINDOWS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的工作原理,详细地向您解释</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类库的基本结构,以及</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序的基本框架</FONT><FONT SIZE=3>——</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>文档</FONT><FONT SIZE=3>/</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>视图结构。</P>
<P> </P>
</FONT><FONT FACE="宋体" LANG="ZH-CN"><P> </P>
</FONT><B><FONT FACE="宋体" LANG="ZH-CN" SIZE=6><P ALIGN="JUSTIFY"><A NAME="_Toc419740439"><A NAME="_Toc419881621">二</FONT><FONT SIZE=6> MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=6>程序结构分析</A></A></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=5><P ALIGN="JUSTIFY"><A NAME="_Toc419740440"><A NAME="_Toc419881622">1 WINDOWS程序工作原理</A></A></P>
</B></FONT><FONT SIZE=3><P>WINDOWS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>程序设计是一种完全不同于传统的</FONT><FONT SIZE=3>DOS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>方式的程序设计方法,它是一种事件驱动方式的程序设计模式。在程序提供给用户的界面中有许多可操作的可视对象。用户从所有可能的操作中任意选择,被选择的操作会产生某些特定的事件,这些事件发生后的结果是向程序中的某些对象发出消息,然后这些对象调用相应的消息处理函数来完成特定的操作。</FONT><FONT SIZE=3>WINDOWS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序最大的特点就是程序没有固定的流程,而只是针对某个事件的处理有特定的子流程,</FONT><FONT SIZE=3>WINDOWS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序就是由许多这样的子流程构成的。</P>
<P>从上面的讨论中可以看出,</FONT><FONT SIZE=3>WINDOWS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序在本质上是面向对象的。程序提供给用户界面的可视对象在程序的内部一般也是一个对象,用户对可视对象的操作通过事件驱动模式触发相应对象的可用方法。程序的运行过程就是用户的外部操作不断产生事件,这些事件又被相应的对象处理的过程。下面是</FONT><FONT SIZE=3>WINDOWS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>程序工作原理的示意图。</P>
<P> </P>
<P> </P>
<P> </P>
<P> </P>
<P> </P>
<P> </P>
<P> </P>
<P> </P>
<P> </P>
<P> </P>
<P> </P>
<P> </P>
<P> </P>
<P> </P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2><P> </P>
<P> </P>
</FONT><B><FONT FACE="宋体" LANG="ZH-CN" SIZE=5><P ALIGN="JUSTIFY"><A NAME="_Toc419740441"><A NAME="_Toc419881623">2 建立应用程序</A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P>	在介绍</FONT><FONT SIZE=3>AppWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的时候,我们已经建立了一个名字为</FONT><FONT SIZE=3>TEST</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的工程,事实上这个框架程序已经可以编译运行了。在</FONT><FONT SIZE=3>BUILD</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>菜单中选择</FONT><FONT SIZE=3>REBUILD ALL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>菜单项,系统开始编译由</FONT><FONT SIZE=3>APPWIZARD</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>自动生成的程序框架中所有文件中的源代码,并且链接生成可执行的应用程序。在</FONT><FONT SIZE=3>BUILD</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>菜单中选择</FONT><FONT SIZE=3>EXECUTE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>菜单项,应用程序就开始开始运行了,虽然我们没有编写一行代码,但是可以看出由系统自动生成的应用程序的界面已经有了一个标准</FONT><FONT SIZE=3>WINDOWS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序所需的几个组成部分,我们要做的事情是往这个应用程序添加必要的代码以完成我们所需要的功能。</P>
<P ALIGN="JUSTIFY">接下来将要对</FONT><FONT SIZE=3>WINDOWS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>自动生成的这个应用程序框架作详细的介绍,让你对</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>方式的</FONT><FONT SIZE=3>WINDOWS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序的工作原理有全面的认识,只有这样你才会知道应该如何往程序框架当中添加需要的代码。</P>
<P ALIGN="CENTER"><IMG SRC="Image21.gif" WIDTH=444 HEIGHT=319>图2.1</P>
</FONT><B><FONT FACE="宋体" LANG="ZH-CN" SIZE=5><P ALIGN="JUSTIFY"><A NAME="_Toc419740442"><A NAME="_Toc419881624">3 程序结构剖析</A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">为了让您对</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>方式的程序的框架有一个总体的认识,这里设计了一个表示程序中的主要类之间的关系的图表:</P>
<P ALIGN="JUSTIFY"> </P>
<P>	</P>
<P>这个图表表示了使用</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>方式的应用程序的四个主要类之间的关系,从中可以看出,</FONT><FONT SIZE=3>CMYAPP</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类主要的作用是用来处理消息的,它统一管理程序收到的所有的消息,然后把消息分配到相应的对象。</FONT><FONT SIZE=3>CMAINFRAME</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>是</FONT><FONT SIZE=3>CMYVIEW</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的父类,也就是说视窗</FONT><FONT SIZE=3>VIEW</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>显示在主框窗</FONT><FONT SIZE=3>MAINFRAME</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的客户区中。类</FONT><FONT SIZE=3>CMYVIEW</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的作用是显示数据,而数据的来源是类</FONT><FONT SIZE=3>CMYDOC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,在</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>程序中,程序的数据是放在文档当中的,而显示数据则是利用视窗方式,文档与视窗分离带来的好处就是一个文档可以同时具有多个视窗,每个视窗只显示文档中的一部分数据,或者以特定的风格显示文档中的数据。文档与视窗分离的另一个好处就是在程序中可以处理多个文档,通过对不同的视窗的处理达到对不同的文档分别处理的目的。</P>
<P>使用过传统的</FONT><FONT SIZE=3>WINDOWS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>编程方法的人都知道,在应用程序中有一个重要的函数</FONT><FONT SIZE=3>WINMAIN</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>(),这个函数是应用程序的基础,用户的操作所产生的消息正是经过这个函数的处理派送到对应的对象中进行处理。在</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>方式的</FONT><FONT SIZE=3>WINDOWS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序中,用来处理消息的是系统自动生成的</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中的类</FONT><FONT SIZE=3>CWINAPP</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的派生类</FONT><FONT SIZE=3>CMYAPP</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,下面就从这个类开始介绍应用程序的框架。</P>
</FONT><B><FONT FACE="宋体" LANG="ZH-CN" SIZE=5><P ALIGN="JUSTIFY"><A NAME="_Toc419740443"><A NAME="_Toc419881625">3.1 类CMYAPP</A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P>类</FONT><FONT SIZE=3>CMYAPP</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>是应用程序运行的基础,注意这一行代码,可以看出这个类是由</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中的类</FONT><FONT SIZE=3>CWINAPP</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>派生来的。在这个类中除了有一般类都有的构造函数,一个重要的成员函数就是</FONT><FONT SIZE=3>INITINSTANCE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,我们知道,在</FONT><FONT SIZE=3>WINDOWS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>环境下面可以运行同一程序的多个实例,函数</FONT><FONT SIZE=3>INITINSTANCE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的作用就是在生成的一个新的实例的时候,完成一些初始化的工作。注意这一行代码,它的作用就是生成一个</FONT><FONT SIZE=3>CMYAPP</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类型的对象,生成的时候系统会主动调用</FONT><FONT SIZE=3>INITINSTANCE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数完成一些必要的初始化工作。</P>
<P>下面研究</FONT><FONT SIZE=3>INITINSTANCE </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数所做的事情,注意这一行代码,它定义了一个文档模板对象指针</FONT><FONT SIZE=3>PDOCTEMPLATE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,通过</FONT><FONT SIZE=3>NEW</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>操作符,系统动态生成了这个文档模板对象,然后使用</FONT><FONT SIZE=3>ADDDOCTEMPLATE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数把这个文档模板对象加入到应用程序所维护的文档模板链表当中,这个文档模板</FONT><FONT SIZE=3>PDOCTEMPLATE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的作用就是把程序用到的框架窗口,</FONT><FONT SIZE=3>CMAINFRAME</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,文档</FONT><FONT SIZE=3>CMYDOC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,视窗</FONT><FONT SIZE=3>CMYVIEW</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>与应用对象</FONT><FONT SIZE=3>CMYAPP</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>联系起来。</P>
</FONT><FONT SIZE=3><P>CMYAPP</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类提供了用户与</FONT><FONT SIZE=3>WINDOWS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序之间进行交流的界面。在生成这个类的对象后,这个对象自动地把自身与</FONT><FONT SIZE=3>WINDOWS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>系统建立联系,接收</FONT><FONT SIZE=3>WINDOWS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>传送的消息,并交给程序中相应的对象去处理,这就免去了程序员许多的工作,使得开发</FONT><FONT SIZE=3>C++</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的</FONT><FONT SIZE=3>WINDOWS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>程序变得简单方便。</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2><P>	</P>
</FONT><B><FONT FACE="宋体" LANG="ZH-CN" SIZE=5><P ALIGN="JUSTIFY"><A NAME="_Toc419740444"><A NAME="_Toc419881626">3.2 类CMAINFRAME</A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P>类</FONT><FONT SIZE=3>CMAINFRAME</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>是由</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中的</FONT><FONT SIZE=3>CFRAMEWND</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>派生来的,所以它也是一个框架窗口。前面已经指出,</FONT><FONT SIZE=3>CMAINFRAME</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>是类</FONT><FONT SIZE=3>CMYVIEW</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的父类,也就是说</FONT><FONT SIZE=3>CMYVIEW</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类的对象显示在主框架窗口的客户区中。在类</FONT><FONT SIZE=3>CMAINFRAME </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中,系统已经从类</FONT><FONT SIZE=3>CFRAMEWND</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>那里继承了处理窗口的一般事件的</FONT><FONT SIZE=3>WINDOWS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>消息,比如改变窗口的大小,窗口最小化等等的成员函数,因此编程的时候程序员不需要再关心此类消息的处理,从而减轻了程序员的负担。当然,如果确实需要重新编写处理此类消息的成员函数,则需要对原有的成员函数进行重载。</P>
<P>在</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>程序中,我们并不需要经常对</FONT><FONT SIZE=3>CMAINFRAME</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类进行操作,更多的是对视窗类进行操作,达到对程序中的数据进行编辑和修改的目的。</P>
<P>最后要指出的是,在</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>方式的程序中,当程序的一个实例被运行的时候,系统根据前面在</FONT><FONT SIZE=3>CMYAPP</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类中介绍的文档模板对象自动生成类</FONT><FONT SIZE=3>CMAINFRAME</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,</FONT><FONT SIZE=3>CMYVIEW</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,</FONT><FONT SIZE=3>CMYDOC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的对象,而不需要程序员主动地去创建这些类的对象。</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN"><P> </P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=2><P> </P>
</FONT><B><FONT FACE="宋体" LANG="ZH-CN" SIZE=5><P ALIGN="JUSTIFY"><A NAME="_Toc419740445"><A NAME="_Toc419881627">3.3类CMyView与CMyDoc</A></A></P>
</B></FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P>之所以把CMyView类和CMyDoc类一起介绍是因为这两个类是密切相关的,</P>
<P>下面的框图可以说明文档与视窗的关系。</P>
<P> </P>
<P> </P>
<P> </P>
<P>在这个框图当中,文档是由文档模板对象生成的,并由应用程序对象管理,而用户则是通过与文档相联系的视窗对象来存储、管理应用程序的数据,用户与文档之间的交互则是通过与文档相关联的视窗对象来进行的。</P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -