📄 走进visual c++.htm
字号:
<P><A name=_Toc419881619></A><A name=_Toc419740437></A><SPAN
style="mso-bookmark: _Toc419881619"><B><SPAN lang=EN-US
style="FONT-SIZE: 18pt">2 MFC编程特点</SPAN></B></SPAN><B><SPAN lang=EN-US
style="FONT-SIZE: 18pt"><o:p></o:p></SPAN></B></P>
<P>如果你曾经使用过传统的<SPAN
lang=EN-US>windows编程方法开发应用程序,你会深刻地体会到,即使是开发一个简单的windows应用程序也需要对windows的编程原理有很深刻的认识,同时也要手工编写很多的代码。因为程序的出错率几乎是随着代码长度的增加呈几何级数增长的,这就使得调试程序变得非常困难。所以传统的windows编程是需要极大的耐心和丰富的编程经验的。</SPAN></P>
<P>近几年来,面向对象技术无论是在理论还是实践上都在飞速地发展。面向对象技术中最重要的就是“对象”的概念,它把现实世界中的气球、自行车等客观实体抽象成程序中的“对象”。这种“对象”具有一定的属性和方法,这里的属性指对象本身的各种特性参数。如气球的体积,自行车的长度等,而方法是指对象本身所能执行的功能,如气球能飞,自行车能滚动等。一个具体的对象可以有许多的属性和方法,面向对象技术的重要特点就是对象的封装性,对于外界而言,并不需要知道对象有哪些属性,也不需要知道对象本身的方法是如何实现的,而只需要调用对象所提供的方法来完成特定的功能。从这里我们可以看出,当把面向对象技术应用到程序设计中时,程序员只是在编写对象方法时才需要关心对象本身的细节问题,大部分的时间是放在对对象的方法的调用上,组织这些对象进行协同工作。</P>
<P><SPAN lang=EN-US>MFC的英文全称是Microsoft Fundation
Classes,即微软的基本类库,MFC的本质就是一个包含了许多微软公司已经定义好的对象的类库,我们知道,虽然我们要编写的程序在功能上是千差万别的,但从本质上来讲,都可以化归为用户界面的设计,对文件的操作,多媒体的使用,数据库的访问等等一些最主要的方面。这一点正是微软提供MFC类库最重要的原因,在这个类库中包含了一百多个程序开发过程中最常用到的对象。在进行程序设计的时候,如果类库中的某个对象能完成所需要的功能,这时我们只要简单地调用已有对象的方法就可以了。我们还可以利用面向对象技术中很重要的“继承”方法从类库中的已有对象派生出我们自己的对象,这时派生出来的对象除了具有类库中的对象的特性和功能之外,还可以由我们自己根据需要加上所需的特性和方法,产生一个更专门的,功能更为强大的对象。当然,你也可以在程序中创建全新的对象,并根据需要不断完善对象的功能。</SPAN></P>
<P>正是由于<SPAN
lang=EN-US>MFC编程方法充分利用了面向对象技术的优点,它使得我们编程时极少需要关心对象方法的实现细节,同时类库中的各种对象的强大功能足以完成我们程序中的绝大部分所需功能,这使得应用程序中程序员所需要编写的代码大为减少,有力地保证了程序的良好的可调试性。</SPAN></P>
<P>最后要指出的是<SPAN
lang=EN-US>MFC类库在提供的对象的各种属性和方法都是经过谨慎的编写和严格的测试,可靠性很高,这就保证了使用MFC类库不会影响程序的可靠性和正确性。</SPAN></P>
<P><A name=_Toc419881620></A><A name=_Toc419740438></A><SPAN
style="mso-bookmark: _Toc419881620"><B><SPAN lang=EN-US
style="FONT-SIZE: 18pt">3使用Wizard</SPAN></B></SPAN><B><SPAN lang=EN-US
style="FONT-SIZE: 18pt"><o:p></o:p></SPAN></B></P>
<P><SPAN lang=EN-US>Visual
C++是一种功能强大的通用程序设计语言,它提供了各种向导和工具帮助我们来实现所需的功能,在一定程度上实现了软件的自动生成和可视化编程。下面就为你介绍VC集成环境中几个最主要的开发工具的使用方法。</SPAN></P>
<P>首先要介绍的是<SPAN
lang=EN-US>Appwizard工具,这个工具的作用是帮助我们一步步地生成一个新的应用程序,并且自动生成应用程序所需的基本代码。下面我们就介绍使用Appwizard生成一个应用程序的具体步骤。</SPAN></P>
<UL type=disc>
<LI class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l49 level1 lfo1; tab-stops: list 36.0pt">单击<SPAN
lang=EN-US>File菜单New菜单项,系统弹出的对话让我们选择所要创建的文件类型,这里的文件分成了Files,Project,Workspaces,Other
documents四种大类型,每一个类型下面又包含许多具体的文件类型,选中Projects标签,标签下的工作区中列出的是各种不同的应用程序类型,比如dll类型的动态链接库,exe类型的可执行程序等,这里选中MFC
Appwizard(exe)选项,表示要创建的是一个使用MFC基本类</SPAN> </LI></UL>
<P>库进行编程的可执行程序。如下图<SPAN lang=EN-US>1.1所示:</SPAN></P>
<P><SPAN lang=EN-US><IMG id=_x0000_i1025 height=291
src="走进Visual C++.files/Image5.gif" width=446 border=0>图 1.1</SPAN></P>
<P> </P>
<UL type=disc>
<LI class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l12 level1 lfo2; tab-stops: list 36.0pt">选好后在<SPAN
lang=EN-US>project
name一栏中为程序起一个名字为test,在location一栏中为程序定义文件存放的目录,对话框右下角的platforms一栏中的Win32项表示要创建的程序是建立在32位的windows平台基础上。单击OK按钮,就启动了使用MFC方式开发应用程序的
Appwizard功能。</SPAN> </LI></UL>
<P><SPAN lang=EN-US><IMG id=_x0000_i1026 height=291
src="走进Visual C++.files/Image6.gif" width=446 border=0><SPAN
style="mso-tab-count: 4">
</SPAN><SPAN style="mso-spacerun: yes"> </SPAN>图1.2</SPAN></P>
<UL type=disc>
<LI class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l60 level1 lfo3; tab-stops: list 36.0pt"><SPAN
lang=EN-US>Wizard让我们选择程序的类型和程序中的资源所用的语种,这里不妨选择程序类型为单文档界面,语种为英语,然后单击NEXT按钮。</SPAN>
</LI></UL>
<P><SPAN lang=EN-US><IMG id=_x0000_i1027 height=297
src="走进Visual C++.files/Image7.gif" width=387 border=0></SPAN></P>
<P><SPAN lang=EN-US><SPAN
style="mso-tab-count: 3">
</SPAN>图1.3</SPAN></P>
<UL type=disc>
<LI class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l16 level1 lfo4; tab-stops: list 36.0pt"><SPAN
lang=EN-US><IMG id=_x0000_i1028 height=306 src="走进Visual C++.files/Image8.gif"
width=400 border=0>Wizard让我们选择是否需要提供数据库方面的支持,这里选择NONE,然后单击NEXT按钮。</SPAN>
</LI></UL>
<P><SPAN lang=EN-US><SPAN
style="mso-tab-count: 2">
</SPAN>图1.4</SPAN></P>
<P> </P>
<UL type=disc>
<LI class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l11 level1 lfo5; tab-stops: list 36.0pt">下面选择程序中对复合文档的支持,这里选择<SPAN
lang=EN-US>NONE。</SPAN> </LI></UL>
<P><SPAN lang=EN-US><IMG id=_x0000_i1029 height=330
src="走进Visual C++.files/Image9.gif" width=430 border=0><SPAN
style="mso-tab-count: 2"> </SPAN>图 1.5</SPAN></P>
<P> </P>
<UL type=disc>
<LI class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l30 level1 lfo6; tab-stops: list 36.0pt">接着选择程序的其它一些特性,如提供对<SPAN
lang=EN-US>WINSOCK的支持等。这里对系统的缺省值不作改变,如下图1.6所示。单击NEXT按钮。</SPAN> </LI></UL>
<P> </P>
<P><SPAN lang=EN-US><SPAN
style="mso-tab-count: 3">
</SPAN>图1.6</SPAN></P>
<P><SPAN lang=EN-US><IMG id=_x0000_i1030 height=335
src="走进Visual C++.files/Image10.gif" width=437 border=0></SPAN></P>
<UL type=disc>
<LI class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l15 level1 lfo7; tab-stops: list 36.0pt">在第五步中,对话框上部选择是否为程序自动生成注释,对话框的下部用来选择使用<SPAN
lang=EN-US>MFC类库的方式是动态链接库方式还是静态链接方式,使用动态链接库方式时在以后生成的可执行应用程序中并不真正包含MFC类库中的对象,而使用静态链接方式时,则把MFC库中的代码生成为应用程序的一部分,这时生成的应用程序也就相对大一些。选好后单击NEXT<IMG
id=_x0000_i1031 height=358 src="走进Visual C++.files/Image11.gif" width=467
border=0>按钮。</SPAN> </LI></UL>
<P style="TEXT-ALIGN: center" align=center>图<SPAN lang=EN-US>1.7</SPAN></P>
<P> </P>
<UL type=disc>
<LI class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l13 level1 lfo8; tab-stops: list 36.0pt">进入<SPAN
lang=EN-US>APPWIZARD的最后一个步骤,对话框中的提示信息指明了系统将要自动创建的对象和相关文件,以及派生出这些对象的MFC的基类等内容。在这一步当中,我们还可以对视图类的基类进行选择,单击FINISH按钮。</SPAN>
</LI></UL>
<P style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US><IMG id=_x0000_i1032
height=321 src="走进Visual C++.files/Image12.gif" width=418
border=0>图1.8</SPAN></P>
<P> </P>
<UL type=disc>
<LI class=MsoNormal
style="mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l33 level1 lfo9; tab-stops: list 36.0pt">游览一下对话框中对将要生成的程序的有关信息的描述后单击<SPAN
lang=EN-US>OK按钮。系统就自动为我们生成一个使用MFC基本类库的应用程序的基本框架,在以后将会对这个框架的内容作详细的介绍。</SPAN>
</LI></UL>
<P> </P>
<P style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US><IMG id=_x0000_i1033
height=380 src="走进Visual C++.files/Image13.gif" width=408
border=0>图1.9</SPAN></P>
<P> </P>
<P><SPAN lang=EN-US><IMG id=_x0000_i1034 height=264
src="走进Visual C++.files/Image14.gif" width=401
border=0>接下来介绍VC集成环境中提供的一个很重要的工具CLASSWIZARD,它主要是用来管理程序中的对象和消息的,这个工具对于MFC编程显得尤为重要。单击VIEW菜单的CLASSWIZARD项,就可以运行MFC
CLASSWIZARD,在这个对话框中就可以对程序中的对象和消息进行管理了。</SPAN></P>
<P style="TEXT-ALIGN: center" align=center>图<SPAN lang=EN-US>1.10</SPAN></P>
<P> </P>
<P>在对话框中的<SPAN lang=EN-US>MESSAGE
MAPS标签下,PROJECT栏中的内容代表当前程序的名字。CLASSWNAME下拉列表框列出的就是程序当前用到的所有类的名字,在MESSAGE一栏中列出的就是一个选中的类所能接收到的所有的消息,在WINDOWS程序设计中,消息是个极为重要的概念,用户通过窗口界面的各种操作最后都转化为发送到程序中的对象的各种消息,下面就向您介绍在WINDOWS程序设计中最常用的一些消息:</SPAN></P>
<P><B><SPAN lang=EN-US>1
窗口消息:WM_CREATE,WM_DESTROY,WM_CLOSE<o:p></o:p></SPAN></B></P>
<P>我们创建一个窗口对象的时候,这个窗口对象在创建过程中收到的就是<SPAN
lang=EN-US>WM_CREATE消息,对这个消息的处理过程一般用来设置一些显示窗口前的初始化工作,如设置窗口的大小,背景颜色等,WM_DESTROY消息指示窗口即将要被撤消,在这个消息处理过程中,我们就可以做窗口撤消前的一些工作。WM_CLOSE
wm_close消息发生在窗口将要被关闭之前,在收到这个消息后,一般性的操作是回收所有分配给这个窗口的各种资源。在windows系统中资源是很有限的,所以回收资源的工作还是非常重要的。</SPAN></P>
<P><B><SPAN lang=EN-US>2
键盘消息:WM_CHAR,WM_KEYDOWN,WM_KEYUP<o:p></o:p></SPAN></B></P>
<P>这三个消息用来处理用户的键盘数据,当用户在键盘上按下某个键的时候,会产生<SPAN
lang=EN-US>WM_KEYDOWN消息,释放按键的时候又回产生WM_KEYUP消息,所以WM_KEYDOWN与WM_KEYUP消息一般总是成对出现的,至于WM_CHAR消息是在用户的键盘输入能产生有效的ASCII码时才会发生。这里特别提醒要注意前两个消息与WM_CHAR消息在使用上是有区别的。在前两个消息中,伴随消息传递的是按键的虚拟键码,所以这两个消息可以处理非打印字符,如方向键,功能键等。而伴随WM_CHAR消息的参数是所按的键的ASCII码,ASCII码是可以区分字母的大小写的。而虚拟键码是不能区分大小写的。</SPAN></P>
<P><SPAN lang=EN-US>3 <B>鼠标消息:WM_MOUSEMOVE,WM_LBUTTONDOWN, WM_LBUTTONUP,
WM_LBUTTONDBCLICK,WM_RBUTTONDOWN,
WM_RBUTTONUP,WM_RBUTTONDBCLICK<o:p></o:p></B></SPAN></P>
<P>这组消息是与鼠标输入相关的,<SPAN
lang=EN-US>WM_MOUSEMOVE消息发生在鼠标移动的时候,剩余的六个消息则分别对应于鼠标左右键的按下、释放、双击事件,要指出的是WINDOWS系统并不是在鼠标每移动一个像素时都产生MOUSEMOVE消息,这一点要特别注意。</SPAN></P>
<P><B><SPAN lang=EN-US>4 另一组窗口消息:WM_MOVE , WM_SIZE , WM_PAINT
<o:p></o:p></SPAN></B></P>
<P>当窗口移动的时候产生<SPAN lang=EN-US>WM_MOVE
消息,窗口的大小改变的时候产生WM_SIZE消息,而当窗口工作区中的内容需要重画的时候就会产生WM_PAINT消息。</SPAN></P>
<P><B><SPAN lang=EN-US>5 焦点消息WM_SETFOCUS,WM_KILLFOCUS<o:p></o:p></SPAN></B></P>
<P>当一个窗口从非活动状态变为具有输入焦点的活动状态的时候,它就会收到<SPAN
lang=EN-US>WM_SETFOCUS消息,而当窗口失去输入焦点的时候它就会收到WM_KILLFOCUS消息。</SPAN></P>
<P><B><SPAN lang=EN-US>6 定时器消息:WM_TIMER<o:p></o:p></SPAN></B></P>
<P>当我们为一个窗口设置了定时器资源之后,系统就会按规定的时间间隔向窗口发送<SPAN
lang=EN-US>WM_TIMER消息,在这个消息中就可以处理一些需要定期处理的事情。</SPAN></P>
<P>最后要指出的一点是,在<SPAN
lang=EN-US>WINDOWS环境下,消息的来源是多方面的,最常见的是用户的操作产生消息,系统在必要的时候也会向程序发送系统消息,其他在运行中的程序也可以向程序发送消息。此外,在程序的内部,也可以根据需要在适当的时候主动产生消息,比如主动产生WM_PAINT消息以实现需要的重画功能。</SPAN></P>
<P><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">
</SPAN>上面介绍了MESSAGE栏中主要的消息,在MEMBER
FUNCTION一栏中列出的是目前被选中的类已经有的成员函数。这些成员函数一般说来是与这个类可以接收的消息一一对应的。也就是说,一个成员函数一般总是用来处理某个特定的消息。如果在MESSAGE栏中的某个消息在程序中需要处理,但目前还没有相应的类成员函数,比如这里选中WM_TIMER这个消息,它目前还没有相应的对应的类的成员函数,</SPAN></P>
<P>单击<SPAN lang=EN-US>ADD FUNCTION按钮,</SPAN></P>
<P><SPAN lang=EN-US><IMG id=_x0000_i1035 height=298
src="走进Visual C++.files/Image15.gif" width=453 border=0>图1.11</SPAN></P>
<P>系统就自动为<SPAN
lang=EN-US>WM_TIMER消息在类中添加了对应的成员函数ONTIMER,单击EDITCODE按钮,可以发现系统已经自动生成了完成ONTIMER函数所需的基本代码,我们只要在这些基本代码的基础上再添加所需要的代码就可以了。</SPAN></P>
<P><SPAN lang=EN-US><IMG id=_x0000_i1036 height=268
src="走进Visual C++.files/Image16.gif" width=408 border=0>注意对话框中的ADD
CLASS按钮,它用来往当前应用程序中添加一个新的类 。</SPAN></P>
<P>单击后选中<SPAN lang=EN-US>NEW菜单,</SPAN></P>
<P style="TEXT-ALIGN: center" align=center>图<SPAN lang=EN-US>1.12</SPAN></P>
<P> </P>
<P><SPAN lang=EN-US><IMG id=_x0000_i1037 height=342
src="走进Visual C++.files/Image17.gif" width=410 border=0>系统弹出了NEW
CLASS对话框用于生成一个新的类。在这个对话框中需要为类起个名字,设置类文件的名字,另外还要在BASE CLASS一栏
的下拉列表框中选择某个已有的类作为基类,设好需要的信息后单击OK就生成了一个新的类。</SPAN></P>
<P style="TEXT-ALIGN: center" align=center>图<SPAN lang=EN-US>1.13</SPAN></P>
<P><SPAN lang=EN-US>CLASS
WIZARD还有一些很强大的功能,这里就不再详细介绍,你会在不断的学习中慢慢地了解和掌握。</SPAN></P>
<P>最后介绍一下集成环境提供的一个重要工具<SPAN lang=EN-US>RESOUCR
EDITOR,也就是资源编辑器。在VC开发的应用程序中要用到大量的位图,菜单,工具条,对话框等各种资源。这些资源对于程序而言是相对独立的,所以可以对它们进行单独的编辑,然后使用在程序中。而RESOUCE
EDITOR正是为编辑资源提供了一种可视化的开发方法。极大地减轻了程序员的负担。</SPAN></P>
<P>单击<SPAN
lang=EN-US>FILE菜单的OPEN菜单项,然后在对话框中选择打开TEST.RC文件,就可以开始使用资源编辑器了。在左边的工作区中按类型列出了程序中用到的所有的资源,双击其中的某个类型,比如双击MENU资源,MENU目录的下面列出的就是系统已经有的MENU类型的资源,选中其中一个并双击,在右边的工作区中列出了这个资源当前的样子,我们就可以在工作区中对资源进行可视化的编辑和修改了。</SPAN></P>
<P><SPAN lang=EN-US><IMG id=_x0000_i1038 height=312
src="走进Visual C++.files/Image18.gif" width=416 border=0><SPAN
style="mso-tab-count: 2"> </SPAN><SPAN
style="mso-spacerun: yes"> </SPAN>图1.14</SPAN></P>
<P> </P>
<P>如何添加一个资源呢?单击<SPAN lang=EN-US>INSERT菜单,选中RESOURCE菜单项,系统弹出INSERT
RESOURCE对话框。如图1.15。</SPAN></P>
<P> </P>
<P> </P>
<P> </P>
<P> </P>
<P style="MARGIN-LEFT: 360pt"><SPAN lang=EN-US><IMG id=_x0000_i1039 height=264
src="走进Visual C++.files/Image19.gif" width=400 border=0>图1.15</SPAN></P>
<P>在图<SPAN
lang=EN-US>1.15这个对话框,在这个对话框中选中一种资源类型,比如选择CURSOR类型,然后单击NEW按钮。在左边的工作区中就出现了我们新生成的资源的标识符,双击这个标识符,在右边的工作区中就可以对这个新的指针形状资源进行可视化编辑了。如图1.16。</SPAN></P>
<P>通过这部分内容的介绍,相信您已经对使用<SPAN lang=EN-US>VISUAL C++开发MFC应用程序的</SPAN></P>
<P style="MARGIN-LEFT: 72pt; TEXT-ALIGN: center" align=center><SPAN
lang=EN-US><IMG id=_x0000_i1040 height=342 src="走进Visual C++.files/Image20.gif"
width=456 border=0>图1.16</SPAN></P>
<P>基本步骤有了认识。在下一章的内容当中,我们将结合<SPAN
lang=EN-US>WINDOWS的工作原理,详细地向您解释MFC类库的基本结构,以及MFC应用程序的基本框架——文档/视图结构。</SPAN></P>
<P> </P>
<P> </P>
<P><A name=_Toc419881621></A><A name=_Toc419740439></A><SPAN
style="mso-bookmark: _Toc419881621"><B><SPAN style="FONT-SIZE: 24pt">二<SPAN
lang=EN-US> MFC程序结构分析</SPAN></SPAN></B></SPAN><B><SPAN lang=EN-US
style="FONT-SIZE: 24pt"><o:p></o:p></SPAN></B></P>
<P><A name=_Toc419881622></A><A name=_Toc419740440></A><SPAN
style="mso-bookmark: _Toc419881622"><B><SPAN lang=EN-US
style="FONT-SIZE: 18pt">1 WINDOWS程序工作原理</SPAN></B></SPAN><B><SPAN lang=EN-US
style="FONT-SIZE: 18pt"><o:p></o:p></SPAN></B></P>
<P><SPAN
lang=EN-US>WINDOWS程序设计是一种完全不同于传统的DOS方式的程序设计方法,它是一种事件驱动方式的程序设计模式。在程序提供给用户的界面中有许多可操作的可视对象。用户从所有可能的操作中任意选择,被选择的操作会产生某些特定的事件,这些事件发生后的结果是向程序中的某些对象发出消息,然后这些对象调用相应的消息处理函数来完成特定的操作。WINDOWS应用程序最大的特点就是程序没有固定的流程,而只是针对某个事件的处理有特定的子流程,WINDOWS应用程序就是由许多这样的子流程构成的。</SPAN></P>
<P>从上面的讨论中可以看出,<SPAN
lang=EN-US>WINDOWS应用程序在本质上是面向对象的。程序提供给用户界面的可视对象在程序的内部一般也是一个对象,用户对可视对象的操作通过事件驱动模式触发相应对象的可用方法。程序的运行过程就是用户的外部操作不断产生事件,这些事件又被相应的对象处理的过程。下面是WINDOWS程序工作原理的示意图。</SPAN></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>
<P><SPAN style="FONT-SIZE: 10pt"> <SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P><SPAN style="FONT-SIZE: 10pt"> <SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P><A name=_Toc419881623></A><A name=_Toc419740441></A><SPAN
style="mso-bookmark: _Toc419881623"><B><SPAN lang=EN-US
style="FONT-SIZE: 18pt">2 建立应用程序</SPAN></B></SPAN><B><SPAN lang=EN-US
style="FONT-SIZE: 18pt"><o:p></o:p></SPAN></B></P>
<P><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">
</SPAN>在介绍AppWizard的时候,我们已经建立了一个名字为TEST的工程,事实上这个框架程序已经可以编译运行了。在BUILD菜单中选择REBUILD
ALL菜单项,系统开始编译由APPWIZARD自动生成的程序框架中所有文件中的源代码,并且链接生成可执行的应用程序。在BUILD菜单中选择EXECUTE菜单项,应用程序就开始开始运行了,虽然我们没有编写一行代码,但是可以看出由系统自动生成的应用程序的界面已经有了一个标准WINDOWS应用程序所需的几个组成部分,我们要做的事情是往这个应用程序添加必要的代码以完成我们所需要的功能。</SPAN></P>
<P>接下来将要对<SPAN
lang=EN-US>WINDOWS自动生成的这个应用程序框架作详细的介绍,让你对MFC方式的WINDOWS应用程序的工作原理有全面的认识,只有这样你才会知道应该如何往程序框架当中添加需要的代码。</SPAN></P>
<P style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US><IMG id=_x0000_i1041
height=319 src="走进Visual C++.files/Image21.gif" width=444
border=0>图2.1</SPAN></P>
<P><A name=_Toc419881624></A><A name=_Toc419740442></A><SPAN
style="mso-bookmark: _Toc419881624"><B><SPAN lang=EN-US
style="FONT-SIZE: 18pt">3 程序结构剖析</SPAN></B></SPAN><B><SPAN lang=EN-US
style="FONT-SIZE: 18pt"><o:p></o:p></SPAN></B></P>
<P>为了让您对<SPAN
lang=EN-US>MFC方式的程序的框架有一个总体的认识,这里设计了一个表示程序中的主要类之间的关系的图表:</SPAN></P>
<P> </P>
<P><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">
</SPAN></SPAN></P>
<P>这个图表表示了使用<SPAN
lang=EN-US>MFC方式的应用程序的四个主要类之间的关系,从中可以看出,CMYAPP类主要的作用是用来处理消息的,它统一管理程序收到的所有的消息,然后把消息分配到相应的对象。CMAINFRAME是CMYVIEW的父类,也就是说视窗VIEW显示在主框窗MAINFRAME的客户区中。类CMYVIEW的作用是显示数据,而数据的来源是类CMYDOC,在MFC程序中,程序的数据是放在文档当中的,而显示数据则是利用视窗方式,文档与视窗分离带来的好处就是一个文档可以同时具有多个视窗,每个视窗只显示文档中的一部分数据,或者以特定的风格显示文档中的数据。文档与视窗分离的另一个好处就是在程序中可以处理多个文档,通过对不同的视窗的处理达到对不同的文档分别处理的目的。</SPAN></P>
<P>使用过传统的<SPAN
lang=EN-US>WINDOWS编程方法的人都知道,在应用程序中有一个重要的函数WINMAIN(),这个函数是应用程序的基础,用户的操作所产生的消息正是经过这个函数的处理派送到对应的对象中进行处理。在MFC方式的WINDOWS应用程序中,用来处理消息的是系统自动生成的MFC中的类CWINAPP的派生类CMYAPP,下面就从这个类开始介绍应用程序的框架。</SPAN></P>
<P><A name=_Toc419881625></A><A name=_Toc419740443></A><SPAN
style="mso-bookmark: _Toc419881625"><B><SPAN lang=EN-US
style="FONT-SIZE: 18pt">3.1 类CMYAPP</SPAN></B></SPAN><B><SPAN lang=EN-US
style="FONT-SIZE: 18pt"><o:p></o:p></SPAN></B></P>
<P>类<SPAN
lang=EN-US>CMYAPP是应用程序运行的基础,注意这一行代码,可以看出这个类是由MFC中的类CWINAPP派生来的。在这个类中除了有一般类都有的构造函数,一个重要的成员函数就是INITINSTANCE,我们知道,在WINDOWS环境下面可以运行同一程序的多个实例,函数INITINSTANCE的作用就是在生成的一个新的实例的时候,完成一些初始化的工作。注意这一行代码,它的作用就是生成一个CMYAPP类型的对象,生成的时候系统会主动调用INITINSTANCE函数完成一些必要的初始化工作。</SPAN></P>
<P>下面研究<SPAN lang=EN-US>INITINSTANCE
函数所做的事情,注意这一行代码,它定义了一个文档模板对象指针PDOCTEMPLATE,通过NEW操作符,系统动态生成了这个文档模板对象,然后使用ADDDOCTEMPLATE函数把这个文档模板对象加入到应用程序所维护的文档模板链表当中,这个文档模板PDOCTEMPLATE的作用就是把程序用到的框架窗口,CMAINFRAME,文档CMYDOC,视窗CMYVIEW与应用对象CMYAPP联系起来。</SPAN></P>
<P><SPAN
lang=EN-US>CMYAPP类提供了用户与WINDOWS应用程序之间进行交流的界面。在生成这个类的对象后,这个对象自动地把自身与WINDOWS系统建立联系,接收WINDOWS传送的消息,并交给程序中相应的对象去处理,这就免去了程序员许多的工作,使得开发C++的WINDOWS程序变得简单方便。</SPAN></P>
<P><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN
style="mso-tab-count: 1"> </SPAN><o:p></o:p></SPAN></P>
<P><A name=_Toc419881626></A><A name=_Toc419740444></A><SPAN
style="mso-bookmark: _Toc419881626"><B><SPAN lang=EN-US
style="FONT-SIZE: 18pt">3.2 类CMAINFRAME</SPAN></B></SPAN><B><SPAN lang=EN-US
style="FONT-SIZE: 18pt"><o:p></o:p></SPAN></B></P>
<P>类<SPAN
lang=EN-US>CMAINFRAME是由MFC中的CFRAMEWND派生来的,所以它也是一个框架窗口。前面已经指出,CMAINFRAME是类CMYVIEW的父类,也就是说CMYVIEW类的对象显示在主框架窗口的客户区中。在类CMAINFRAME
中,系统已经从类CFRAMEWND那里继承了处理窗口的一般事件的WINDOWS消息,比如改变窗口的大小,窗口最小化等等的成员函数,因此编程的时候程序员不需要再关心此类消息的处理,从而减轻了程序员的负担。当然,如果确实需要重新编写处理此类消息的成员函数,则需要对原有的成员函数进行重载。</SPAN></P>
<P>在<SPAN
lang=EN-US>MFC程序中,我们并不需要经常对CMAINFRAME类进行操作,更多的是对视窗类进行操作,达到对程序中的数据进行编辑和修改的目的。</SPAN></P>
<P>最后要指出的是,在<SPAN
lang=EN-US>MFC方式的程序中,当程序的一个实例被运行的时候,系统根据前面在CMYAPP类中介绍的文档模板对象自动生成类CMAINFRAME,CMYVIEW,CMYDOC的对象,而不需要程序员主动地去创建这些类的对象。</SPAN></P>
<P> </P>
<P><SPAN style="FONT-SIZE: 10pt"> <SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P><A name=_Toc419881627></A><A name=_Toc419740445></A><SPAN
style="mso-bookmark: _Toc419881627"><B><SPAN lang=EN-US
style="FONT-SIZE: 18pt">3.3类CMyView与CMyDoc</SPAN></B></SPAN><B><SPAN lang=EN-US
style="FONT-SIZE: 18pt"><o:p></o:p></SPAN></B></P>
<P>之所以把<SPAN lang=EN-US>CMyView类和CMyDoc类一起介绍是因为这两个类是密切相关的,</SPAN></P>
<P>下面的框图可以说明文档与视窗的关系。</P>
<P> </P>
<P> </P>
<P> </P>
<P>在这个框图当中,文档是由文档模板对象生成的,并由应用程序对象管理,而用户则是通过与文档相联系的视窗对象来存储、管理应用程序的数据,用户与文档之间的交互则是通过与文档相关联的视窗对象来进行的。</P>
<P>生成一个新的文档的时候,<SPAN
lang=EN-US>MFC程序同时生成一个框架窗口,并且在框架窗口的客户区中生成一个视窗对象作为框架窗口的子窗口,这个子窗口以可视化的方式表现文档中的内容。视窗的重要功能就是负责处理用户的鼠标、键盘等操作,通过对视窗对象的处理达到处理文档对象的目的。</SPAN></P>
<P>要指出的一点是,<SPAN
lang=EN-US>WINDOWS应用程序分单文档界面SDI和多文档界面MDI两种,在单文档界面中,文档窗口与主框架窗口是同一概念。而这时的视窗对象则是显示在文档窗口的客户区当中。我们先前生成的TEST程序使用的就是单文档界面方式,此时文档窗口是主框架窗口,即类CMAINFRAME的对象。</SPAN>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -