【VC++开源代码栏目提醒】:网学会员鉴于大家对VC++开源代码十分关注,论文会员在此为大家搜集整理了“MFC应用程序基本框架%233 - 讲义教程”一文,供大家参考学习
第 四 章 MFC应用程序基本框架 Visual C的AppWizard和ClassWizard能自动产生程序的模板和通用部分AppWizard的功能是依照应用程序的形式与用途建立新工程文件产生标准的
代码并为ClassWizard打好基础。
利用AppWizard应用程序向导我们可以不用写一行
代码就能创建具有标准界面的应用程序框架。
一 Appwizard的操作说明 从File菜单上选择New选项将弹出New对话框New对话框有4个选项卡。
1. Files选项卡 在Files选项卡中可以单击希望创建的文件类型。
主要文件类型有 C/C Header File创建C/C头文件 C Source File: 创建C源文件 如果想把新创建的文件加入到一个已经存在的工程中去则需要选择Add to project复选框并选择工程名称在File编辑框中输入文件名称在Location框中输入文件存储的目录。
单击OK按钮即可。
如果创建的新文件不加到任何已经存在的工程中去则选择文件类型后直接单击OK按钮。
新文件以默认的名字创建当用户保存该文件时需要输入文件名和目录。
2. Projects选项卡 在Projects选项卡中可以单击希望创建的工程类型。
主要工程类型有 Database Project数据库工程 Makefile制作Makefile文件 MFC AppWizarddll用MFC应用程序向导创建动态库 MFC AppWizardexe用MFC应用程序向导创建可执行文件 Win32 Console Application创建DOS下的Win32应用程序 Win32 Dynamic-Link Library创建Win32动态链接库 Win32 Static Library创建Win32动态链接库 用户单击希望创建的工程类型然后在Project name编辑框中输入工程的名称系统自动为新工程提供一个默认目录用户可以改变。
如果用户要把新工程加入到打开的Workspace窗口中应选择Add to current workspace单选按钮。
否则系统自动创建一个新的Workspace窗口来包含该工程。
如果要使新工程成为一个已经存在的工程的子工程可选择Dependency of复选框并指定工程的名称。
Workspace选项卡用来指定希望创建的Workspace类型。
Other Documents选项卡用来选择希望创建的文档文件的类型 二 使用Appwizard生成一个应用程序框架 1在主窗口中选择菜单项FileNew打开New对话框。
2在New对话框中选择Projects选项卡在左侧的工程类型列表中选择MFC AppWizardexe选项。
3在New对话框右侧的Project name框中输入工程的名称FirstApp。
4在New对话框右侧的Location框中输入该工程文件存储的位置如E:FirstApp。
5 选择Win32平台。
6单击OK按钮后弹出MFC AppWizard—Step 1对话框然后依次进入6个对话框。
第一步进入AppWizard的第一个对话框该对话框用于设置应用程序的类型、结构及语言等选项。
该对话框首先用单选按钮询问希望生成何种类型的应用程序共有三个选项单文档、多文档和基于对话框的应用程序。
我们选择Multiple documents单选按钮即创建多文档应用程序。
接着询问是否希望生成文档/视图结构或非文档/视图结构程序。
我们选中该项希望应用程序支持文档/视图结构。
最后询问生成何种语言界面的应用程序从下拉列表框中选择一种语言。
我们选择“中文中国”。
对话框的下部有四个按钮Back为返回上一步Next 为进入下一步Finish为立即生成应用程序Cancel为取消操作返回主菜单。
单击Next按钮将弹出MFC AppWizard—Step 2 of 6对话框。
第二步在第二个对话框中将向用户提出下列问题 应用程序是否支持数据库有4个单选按钮即不支持只生成头文件没有支持文件的数据库视图带文件支持的数据库视图。
如果用户选择包含数据库视图则必须选择一个数据源。
我们选择None即不支持数据库。
单击Next按钮弹出第三个对话框。
第三步第三个对话框主要是有关OLE支持的选项首先询问应用程序支持何种复合文档共有5个单选按钮我们选择None即不支持OLE复合文档。
然后询问是否包含其它的支持共有2个单选按钮。
在默认情况下应用程序支持ActiveX控件。
我们选择默认选项ActiveX Controls表示支持ActiveX控件。
单击Next按钮进入第4个对话框。
第四步第四个对话框用于设置窗口的外观特性首先询问是否具有工具栏、状态栏、Print和Print Preview选项、上下文连机帮助以及3D控件等共7个复选框。
默认情况下有工具栏、状态栏、打印及打印预览以及3D控件。
我们选择默认选项。
然后再询问采用何种样式的工具栏共有2个单选按钮分别为普通样式和IE4样式。
我们选择默认选项Normal即普通样式。
最后询问在最近使用的文件列表中包含多少个文件数目默认值是4我们选默认值。
单击Next按钮进入第5个对话框。
第五步在第5个对话框中向用户询问3个问题。
第一个问题是询问用户想要创建何种风格的应用程序有两个单选按钮分别是MFC标准风格还是Windows Explorer风格我们选默认值MFC标准风格。
第二个问题是询问用户是否需要AppWizard为源文件自动生成注释
代码有两个单选按钮我们选默认值自动生成注释
代码。
这些注释包括各种提示将指导用户在适当的地方添加或修改源
代码。
第三个问题是询问用户怎样使用MFC类库有两个单选按钮分别表示作为动态连接库和静态连接库。
我们选默认选项即作为动态连接库使用。
单击Next按钮进入第6个对话框。
第六步在第6个对话框中列出了AppWizard将要为项目生成的各个类的默认的类名及所在文件的文件名。
用户可以在该对话框中为每个类改变类名、文件名及基类名。
保留其默认设置单击Finish按钮结束AppWizard将显示要创建的项目文件信息最后单击OK按钮AppWizard将自动切换到集成开发环境的主窗口。
至此创建工程的工作结束在项目工作区中将显示工程的所有文件。
选择BuildBuild FirstApp.exe选项或相应的工具按钮对源程序进行编译和连接最后生成FirstApp.exe文件。
在编译和连接的过程中用户可在输出窗格中看到显示出来的信息包括错误信息及警告信息等。
如果顺利生成可执行文件那么在输出窗格中将显示FirstApp.exe— 0 errors 0 warnings的字样表示既没有错误也没有警告。
生成可执行文件后选择BuildExecute FirstApp.exe或相应的工具按钮 就可以执行该应用程序。
三 程序中的文件 使用Windows的资源管理器查看上一节利用MFC应用程序向导生成的项目目录可以发现该目录下有十多个文件和ResDebug或Release视编译方式而定系统默认为Debug方式两个文件夹。
其中Res目录用于存放项目的各种资源文件如图片、图标、光标等。
Debug目录用于存放可执行文件和编译链接时产生的中间文件。
下面对一些重要的文件进行具体说明以生成的工程FirstApp为例。
1. 项目文件 FirstApp.dsw工作区文件可以通过它来打开Visual C项目。
FirstApp.clwClassWizard数据库文件存放由ClassWizard使用的信息。
ClassWizard可以使用这些信息来编辑已有的类或者添加新类。
FirstApp.dsp使用应用程序向导生成的
VC项目的主项目文件包含了有关生成文件的Visual C版本信息以及程序的平台、配置和项目的功能等信息。
2. 程序
代码文件 我们没有输入一行
代码AppWizard就按照我们提出的要求自动生成了一组程序
代码这些程序为我们提供了应用程序的基本框架。
在ClassView选项卡中可以看到该应用程序框架包含5个主要的派生类文档类、视图类、应用程序类、主边框窗口类和子边框窗口类每个类都执行特定的任务。
组成这5个类的文件分别为 FirstApp.h FirstApp.cpp用户程序的应用程序类CFirstApp的头文件和源
代码文件该类由CwinApp类派生。
FirstAppDoc.hFirstAppDoc.cpp用户程序的文挡类CFirstAppDoc的头文件和源
代码文件该类由Cdocument类派生。
FirstAppView.hFirstAppView.cpp用户程序的视图类CFirstAppView的头文件和源
代码文件该类由Cview类派生。
MainFrm.hMainFrm.cpp用户程序的主框架窗口类CmainFrm的头文件和源
代码文件。
ChildFrm.hChildFrm.cpp用户程序的子框架窗口类CchildFrm的头文件和源
代码文件。
3. 资源文件 resouce.h包含define常量定义的头文件包含所有资源符号的定义。
FirstApp.rcASCII码资源描述文件列出应用程序用到的所有可用资源例如res文件夹中的图标、位图资源等。
这个文件可以在Visual C中直接编辑。
resFirstApp.rc2和FirstApp.rc类似区别在于文件不能由Visual C直接编辑。
resFirstApp.ico包含应用程序图标的图标文件当程序最小化或在资源管理器中查看程序文件时均显示该图标。
另外也在About对话框中显示。
resFirstAppDoc.ico包含MDI子窗口图标的图标文件。
Toolbar.bmp位图文件用于创建工具栏的平铺图象。
初始的工具拦和状态拦在CmainFrame类中构造。
可以使用资源编辑器编辑此工具拦位图并更新FirstApp.rc中的IDR_MAINFRAME TOOLBAR数组以添加工具拦按扭。
4. 其它文件 stdafx.hstdafx.cpp用于建立预编译头文件FirstApp.pch和预编译类型文件FirstApp.obj。
ReadMe.txt程序的说明文挡。
FirstApp.reg注册表文件。
如果在Document Template Strings属性页中输入了扩展名就会产生这个文件。
另外如果在第四部设置应用程序的界面风格时选择了Context-sensitive Help选项还会出现Help目录程序在这个目录中存储相关文件。
5. 程序中的注释 在编码中使用注释是一种很好的编程风格。
在MFC源文件和MFC应用程序向导创建的文件中都已经自动添加了一些注释更好的理解这些注释对理解
代码大有好处。
下面列出了一个典型的类声明中的
代码其中使用注释依照类成员的具体用法将它们进行了划分。
如 class CFirstAppDoc : public CDocument protected: // create from serialization only CFirstAppDoc DECLARE_DYNCREATECFirstAppDoc // Attributes public: // Operations public: // Overrides // ClassWizard generated virtual function overrides //AFX_VIRTUALCFirstAppDoc public: virtual BOOL OnNewDocument virtual void SerializeCArchive ar //AFX_VIRTUAL // Implementation public: 类声明的“//Constructors”节中声明构造函数以及使用对象所需的初始化函数。
类声明的“//Attributes”节包含对象的公共特性或属性这些特性或属性通常是成员函数或Get/Set函数。
Get函数一般为const类型因为大多数情况下它们都没有副作用。
类声明的“//Operations”节包含成员函数可以在对象上调用这些函数使该对象执行任务或操作。
这些函数通常是非const的因为它们通常有副作用。
类声明中的“//Overridables”节包含虚函数当用户需要修改基类的行为时可以在派生类中重写这些函数。
虚函数的名称通常以On开头。
另外在某些类中还可以看到注释“//Advanced Overridables”这些是可能只有高级程序员才会尝试重写的函数您可能永远都不需要重写它们。
需要注意的是这些注释只是MFC的约定并不是编程的固定规则。
有些注释是是为ClassWizard自动舔加
代码用的标志如 //AFX_VIRTUALCFirstAppDoc … //AFX_VIRTUAL 这些注解多半是ClassWizard用来维护程序之用ClassWizard会自动修改注解内的程序在对MFC程序操作尚未熟悉之前请不要随意修改注解标记内的程序以免出错。
6. 程序中的主要成员类 MFC中有许多类但只有少数几个核心的类会对应用程序的基本框架产生影响CChildFrame只有在选择创建多文档程序时才会出现。
它们分别由CWinApp CDocument CView CFrameWnd派生另外再加上CDocTemplate 这5个类构成了大部分MFC应用程序的核心开发人员主要在这5个类的基础上编写
代码。
用MFC编写的程序中唯一必不可少的类就是CWinApp。
它控制程序的流程。
每一个MFC程序必须有且只有一个由CWinApp类派生的对象并把它声明为全局类型。
文档类用来存放数据视图类用来显示和操作数据。
AppWizard自动创建一个文档和一个视图向导知道这两个类联系在一起并在视图类中创建了与文档相关联的函数GetDocument。
每个视图都必须与某个文档相关联视图可以使用GetDocument函数获得与它相关联的文档类对象的指针。
视图显示在文档框架窗口中在单文档程序中文档框架窗口就是应用程序的主框架窗口。
在多文档程序中文档窗口显示在主框架窗口的子窗口中。
文档模板类将文档类、视图类和框架窗口类的对象联系起来。
四 程序分析 1总体流程 Windows应用程序主要是围绕其应用程序类展开的其初始化、运行以及结束清理工作均由应用程序类完成。
应用程序类构成了Windows应用程序的主执行流程。
以前用API编写的Windows应用程序中有一个主函数WinMain而MFC把WinMain函数封装起来隐藏在应用程序的基本框架内。
在程序运行时程序的基本框架首先取得控制权做一些程序的初始化工作然后构造应用程序类的对象构造对象时要调用应用程序类的构造函数。
创建完所有的静态和全局对象后调用入口函数WinMain。
WinMain函数首先获得指向应用程序类对象的指针接着调用应用程序类的InitInstance函数进行初始化工作。
然后调用应用程序类的Run函数运行程序的消息循环完成API函数中GetMessage、 TranslateMessage及 DispatchMessage三个函数的功能。
最后调用应用程序类的ExitInstance函数结束程序删除注册的窗口释放内存等。
在FirstApp.cpp中可以看到当FirstApp应用程序开始执行时系统首先创建一个应用程序类对象然后对该对象进行初始化操作执行InitInstance函数接下来调用应用程序对象的Run成员函数进入消息循环在该程序结束时执行ExitInstance函数结束运行。
在FirstApp.h中使用以下语句来派生应用程序类 class CFirstAppApp : public CWinApp 接下来是CFirstAppApp类的声明部分其中定义了三个基本的成员函数 CFirstAppApp这是CFirstAppApp类的构造函数。
virtual BOOL InitInstance该函数初始化应用程序类实例函数。
afx_msg void OnAppAboutAbout对话框函数用于处理About对话框的行为。
在FirstApp.cpp中用以下
代码将应用程序类实例化即创建一个应用程序对象 CFirstAppApp theApp 可以看到该语句不包含在任何类定义或成员函数中因而是全局定义的。
2InitInstance函数 该函数用于初始化应用程序类实例使程序做好运行前的准备工作。
具体流程为 1加入对ActiveX控件的支持 首先调用AfxEnableControlContainer函数来允许应用程序支持ActiveX控件。
2设置3D控件 ifdef _AFXDLL Enable3dControls // Call this when using MFC in a shared DLL else Enable3dControlsStatic // Call this when linking to MFC statically endif 通过调用成员函数Enable3dControls或Enable3dControlsStatic来允许对话框和窗口具有三维外观。
3设置一些初始化信息 SetRegistryKey_TLocal AppWizard-Generated Applications 注该行设置注册表的关键字可以将该字符串更改为另外的字符串如公司的名称等。
LoadStdProfileSettings // Load standard INI file options including MRU 注加载标准的INI文件选项包括最近使用的文件名 SetRegistryKey函数用于设置注册表关键字。
调用LoadStdProfileSettings则是为了从.INI文件中加载标准文件选项和设置信息。
4注册文档模板 CMultiDocTemplate pDocTemplate pDocTemplate new CMultiDocTemplate IDR_FIRSTATYPE RUNTIME_CLASSCFirstAppDoc RUNTIME_CLASSCChildFrame // custom MDI child frame RUNTIME_CLASSCFirstAppView AddDocTemplatepDocTemplate 上述语句用于创建并注册一个多文档模板文档模板用于连接文档、边框、窗口和视图。
① 定义一个指向CMultiDocTemplate类对象的指针 ② 调用CMultiDocTemplate类的构造函数CMultiDocTemplate来初始化该对象指针。
其中第一个参数IDR_FIRSTATYPE是与文档类型相匹配的资源ID后三个参数都是对RUNTIME_CLASS宏的调用使得应用程序能够动态地创建这三个类的实例CFirstAppDoc类、CChildFrame类和CFirstAppView类。
③ 调用AddDocTemplate函数来注册该文档模板。
AddDocTemplatepDocTemplate 该AddDocTemplate函数有一个参数该参数指向需要添加的文档模板对象的指针。
该函数用于将新的文档模板添加到当前应用程序所保存的文档模板列表中去。
5创建主边框窗口 CMainFrame pMainFrame new CMainFrame if pMainFrame-LoadFrameIDR_MAINFRAME return FALSE m_pMainWnd pMainFrame 从而得到一个指向CMainFrame类对象的指针。
6处理命令行 // Parse command line for standard shell commands DDE file open 注对标准的shell命令、DDE命令、文件打开命令进行分析 CCommandLineInfo cmdInfo ParseCommandLinecmdInfo // Dispatch commands specified on the command line分发命令行中指定的命令 if ProcessShellCommandcmdInfo return FALSE 首先建立一个空白的CCommandLineInfo对象来存放应用程序运行时接收的任何参数。
然后调用ParseCommandLinecmdInfo函数来分析命令行并将其填入CCommandLineInfo对象。
最后调用ProcessShellCommandcmdInfo函数来处理命令行参数完成对命令行的处理。
7显示主边框窗口 pMainFrame-ShowWindowm_nCmdShow pMainFrame-UpdateWindow 这两行语句用来显示并更新主框架窗口。
其中m_nCmdShow参数用于规定窗口以何种方式显示其主要取值有 SW_HIDE隐藏此窗口将活动焦点传给另一窗口 SW_MINIMIZE最小化该窗口并激活系统队列中的顶层窗口 SW_SHOW激活该窗口并在当前位置以当前大小显示它 SW_SHOWMAXIMIZED激活该窗口并最大化显示 8返回 return TRUE 最后InitInsance函数返回TRUE。
上一篇:
U_Boot在s3c2410上的移植及功能扩展
下一篇:
思想政治工作的创新