C++MFC教程.docx
《C++MFC教程.docx》由会员分享,可在线阅读,更多相关《C++MFC教程.docx(64页珍藏版)》请在冰点文库上搜索。
C++MFC教程
第1章 VisualC++基础
本章首先介绍了VisualC++6.0的安装,然后讨论了应用程序向导、类向导,以及文档视图结构、IDE、辅助工具等几方面的内容。
应用程序向导和类向导实际上是IDE的一部分,由于特别重要,故单独列出。
辅助工具讲的是第三方开发的辅助工具,它是集成开发环境的补充,有了它,编写程序将更加轻松快捷。
本章还将针对各个难点提供多个简单而实用的例子,可以帮助读者快速学习并掌握VisualC++开发基础。
1.1.1VisualC++6.0的安装
1.1.2应用程序向导
1.1.3类向导
1.1.4文档视图结构
1.1.5IDE
1.1.6辅助工具
1.2.1新建工作空间
1.2.2增加消息映射项
1.2.3关联成员变量
1.2.4调试技巧
1.2.5单文档多视图
1.2.6多文档示例
1.3.1VC项目文件说明1.3.2IDE使用技巧
1.3.3常见问题
1.1.2应用程序向导
使用应用程序向导可以快速生成程序框架。
选择菜单“File→New”命令,此时会弹出“New”对话框,下面对该对话框中的常用选项进行逐一说明。
1.文件(Files)属性页
单击“Files”标签,打开“Files”属性页,如图1-3所示。
图1-3文件属性页
文件类型虽然多,但常用的只有两种:
C/C++HeaderFile(C/C++头文件)和C/C++SourceFile(C/C++源文件)。
新建一个文件,可以按照以下步骤操作。
(1)选择合适的文件类型。
(2)如果想把新文件加入到工程内,选中“Addtoproject”复选框,并在下面的组合框中选择合适的工程。
如果当前没有打开任何工程,“Addtoproject”会被禁用。
(3)在“File”编辑框中输入合适的文件名。
(4)在“Location”编辑框中输入文件存放位置。
2.工程(Projects)属性页
单击“Projects”标签,弹出“Projects”属性页,如图1-4所示。
图1-4工程属性页
常见工程(Project)类型如下。
ATLCOMAppWizard:
ATLCOM应用程序向导。
MFCActiveXControlWizard:
MFCActiveX控件向导。
MFCAppWizard(dll):
MFC应用程序向导(动态库)。
MFCAppWizard(exe):
MFC应用程序向导(可执行文件)。
Win32Application:
Win32应用程序。
Win32ConsoleApplication:
Win32控制台程序。
新建一个工程,可以按照以下步骤操作。
(1)在“Projectname”编辑框中输入工程名。
(2)在“Location”编辑框中输入存放位置。
(3)为新工程新建工作空间或将新工程加到现有的工作空间中。
“DependencyOf”是依赖的意思。
(4)选择运行平台(Platforms)。
(5)选择合适的工程类型,单击“OK”按钮或直接双击工程类型。
3.MFCAppWizard生成应用程序
本部分将介绍如何利用应用程序向导(AppWizard)生成应用程序框架。
应用程序向导提供了一系列选项供用户选择,用户可以选择不同的选项生成不同的应用程序,具体生成应用程序框架的步骤如下。
(1)在“New”对话框中选择“Project”属性页,选择MFCAppWizard(exe)。
输入合适的工程名及存放位置。
单击“确定”按钮,弹出“MFCAppWizard-Step1”对话框,如图1-5所示。
图1-5MFCAppWizard–Step1
Whattypeofapplicationwouldyouliketocreate:
生成何种类型的应用程序。
Singledocument:
单文档。
Multipledocuments:
多文档。
Dialogbase:
基于对话框。
Document/Viewarchitecturesupport:
生成文档视图结构程序。
Whatlanguagewouldyoulikeyourresourcesin:
资源中使用何种语言。
(2)选择“Multipledocuments”单选按钮,单击“Next”按钮。
此时将出现“MFCAppWizard-Step2of6”对话框,如图1-6所示。
图1-6MFCAppWizard-Step2of6
Whatdatabasesupportwouldyouliketoinclude:
应用程序如何支持数据库。
None:
不支持数据库。
Headerfilesonly:
只包含文件。
Databaseviewwithoutfilesupport:
没有支持文件的数据库视图。
Databaseviewwithfilesupport:
带文件支持的数据库视图。
Ifyouincludeadatabaseview,youmustselectadatasource:
用户如果选择包含数据库视图,则必须选择一个数据源。
(3)使用默认值,直接单击“Next”按钮,进入如图1-7所示的对话框。
图1-7MFCAppWizard-Step3of6
Whatcompounddocumentsupportwouldyouliketoinclude:
应用程序支持何种复合文档。
None:
不支持OLE复合文档。
Container:
容器。
Mini-server:
应用程序能够创建和管理复合文档对象,Mini-server程序不能单独运行,只支持嵌入对象。
Full-server:
应用程序能够创建和管理复合文档对象,Full-server程序能够单独运行,并支持链接和嵌入的对象。
Bothcontainerandserver:
容器和服务器。
Wouldyoulikesupportforcompoundfiles:
是否支持复合文档。
Whatothersupportwouldyouliketoinclude:
是否包含其他支持。
Automation:
自动化。
ActiveXControls:
ActiveX控件。
(4)在步骤(3)中直接单击“Next”按钮,使用默认值,打开如图1-8所示的对话框。
图1-8MFCAppWizard-Step4of6
Whatfeatureswouldyouliketoinclude:
生成何种特性的应用程序。
Dockingtoolbar:
生成工具栏。
Initialstatusbar:
生成状态栏。
Printingandprintpreview:
打印及打印预览
Context-sensitiveHelp:
生成支持上下文相关帮助的帮助文件
3DControls:
三维控件
MAPI(MessageAPI):
电子邮件相关功能
WindowsSockets:
它支持基于TCP/IP的网络通信。
Howdoyouwantyourtoolbarstolook:
如何定义工具栏外观。
Normal:
正常。
InternetExplorerReBars:
IE风格。
Howmanyfileswouldyoulikeonyourrecentfilelist:
最近使用的文件列表中包含的文件数目。
(5)直接单击“Next”按钮,使用默认值,打开如图1-9所示的对话框。
图1-9MFCAppWizard-Step5of6
Whatstyleofprojectwouldyoulike:
选择工程样式。
MFCStandard:
标准MFC样式
WindowsExplorer:
Explorer样式
Wouldyouliketogeneratesourcefilecomments:
是否生成源文件注释。
HowwouldliketousetheMFClibrary:
怎样使用MFC类库。
AsasharedDLL:
作为动态链接库。
Asastaticallylinkedlibrary:
作为静态链接库。
(6)直接单击“Next”按钮,使用默认值,打开如图1-10所示的对话框。
图1-10MFCAppWizard-Step6of6图1-11新工程信息概要
在这个对话框中可以修改类名、父类及文件名称。
先在类名列表框中选中要修改的类,然后输入新类名、新文件名、选择新基类。
注意:
只有CEx01View可以更改基类,CEx01App不能改文件名。
(7)单击“Finish”按钮,会弹出“NewProjectInfomation”对话框,上面显示新工程的一些信息,单击“OK”按钮完成新建工程。
会弹出“NewProjectInformation”对话框上面显示新工程的信息,如图1-11所示,单击“OK”按钮关闭就行了。
4.小结
应用程序向导的步骤和选项虽多,但大部分时候都可以采用默认设置。
通常,生成应用程序框架的步骤如下。
(1)在“New”对话框中选择“Project”属性页,选择MFCAppWizard(exe),输入合适的工程名称。
(2)根据需要选择单文档、多文档或基于对话框后,单击“Finish”按钮,后面的设置全部使用默认值。
1.1.3类向导
类向导是集成开发环境的重要工具。
打开或新建一个工程,选择菜单“View→ClassWizard命令(快捷键Ctrl+W)”,会弹出“MFCClassWizard”对话框,此对话框包括下面几个属性页。
MessageMaps属性页:
管理消息和成员之间的联系。
MemberVariables属性页:
管理与控件相关联的成员变量。
Automation属性页:
提供各种支持Automation的特性。
ActiveXEvents属性页:
提供支持各种支持ActiveX的各种特性。
ClassInfo属性页:
显示类信息。
前面两个属性页使用得比较多,下面详细介绍。
1.MessageMap属性页
MessageMap属性页可以让用户增加成员函数来控制消息,也可以删除成员函数和编辑成员函数,如图1-12所示。
图1-12MessageMaps属性页
Project:
显示当前工程名,该下拉列表框列出了当前工作空间的所在有工程。
Classname:
显示当前类名,该下拉列表框列出了当前工程的所有类。
ObjectsIDs:
该列表框列出了当前类所有可能接受消息的对象的ID。
Message:
该列表框列出了当前对象可以处理的消息及可以被重写的虚函数。
Memberfunctions:
该列表框列出了与消息有关的函数,标注“V”的是虚函数,标注“W”的是Windows消息。
Discription:
说明信息。
AddClass按钮:
增加新类。
AddFunction按钮:
增加函数。
DeleteFunction按钮:
删除函数。
EditFunction按钮:
编辑函数。
2.MemberVariables属性页
MemberVariables属性页允许用户管理与控件相关联的变量,以便程序利用这些成员变量同这些控件进行信息交换,如图1-13所示。
图1-13MemberVariables属性页
Project:
选择当前工程名。
Classname:
选择当前类名。
ControlIDs:
当前类关联的窗口的控件。
Type:
成员变量的类型。
Member:
与控件关联的成员变量的名字。
1.1.4文档视图结构
由于使用VisualC++6.0开发的程序,绝大部分是文档视图结构,所以下面介绍文档视图结构的相关知识。
一个商场有许多数据,为了便于处理,将这些数据库存放到数据库中。
不同的员工对数据的要求不同,售货员关心的是商品的价格,人事经理关心的是员工的业绩。
MFC将前者(数据库中的数据)抽象成文档,后者(人机交互)抽象成视图。
与视图有关还有框架和文档模板,下面分别介绍。
文档的本质:
文档是用来保存数据以及关于数据的处理的,当程序响应“File→Open”或“File→New”的时候都会打开一份文档。
文档可以拥有多个视图。
文档和视图的关系可以这样理解:
文档是被视图观察的对象。
视图本质:
视图在Windows中就是一个窗口,也就是一个可视化的矩形区域。
视图是用来表示文档的数据的。
但是每个视图必需依附于一个框架(SDI中是MainFrame,MDI是ChildFrame)。
框架的本质:
框架实际是也是一个Windows窗口。
但是在框架上可以放置菜单、工具栏、状态栏等。
而视图则放在框架的客户区。
因此MFC中我们看到的窗口实际上Frame和View共同作用的结果。
在某一时刻,程序中只有一个活动的文档、框架和视图,即当前的文档、框架、视图。
应用程序类管理文档模板,文档模板管理框架、视图、文档。
一般而言,写代码时,文档类和视图类改得较多,框架类改得比较少,文档模板类几乎不会被修改。
下面突出重点,讲一下文档和视图类的相关内容。
1.文档和视图的相互访问
文档与视图的关系是一对多关系。
在MFC中,文档用CDocument类及其派生类处理,视图类由CView及其派生类处理。
应用程序向导生成程序框架时,会自动为CXXView类生成GetDocument函数,可能通过此函数访问文档类。
由于一个文档类对应多个视图类,可以遍历视图列表,代码如下:
#include"Ex010104View.h"
//...
voidCEx010104Doc:
:
VisiteViews()
{
CEx010104View*pView=NULL;
for(POSITIONpos=GetFirstViewPosition();NULL!
=pos;)
{
pView=(CEx010104View*)GetNextView(pos);
//对视图进行相应操作
}
}
2.视图类的刷新
文档数据发生了变化,所有的视图必须作相应的更新,这时可以用CDocument类的UpdateAllView函数,其原型如下:
voidUpdateAllViews(CView*pSender,LPARAMlHint=0L,CObject*pHint=NULL);
pSender:
指向修改文档的视图的指针,为NULL表示刷新所有的视图。
lHint:
表示关于修改的信息。
pHint:
表示关于修改信息的CObject类指针。
此函数的实现如下:
voidCDocument:
:
UpdateAllViews(CView*pSender,LPARAMlHint,CObject*pHint)
//walkthroughallviews
{ASSERT(pSender==NULL||!
m_viewList.IsEmpty());
//musthaveviewsifsentbyoneofthem
POSITIONpos=GetFirstViewPosition();
while(pos!
=NULL)
{
CView*pView=GetNextView(pos);
ASSERT_VALID(pView);
if(pView!
=pSender)
pView->OnUpdate(pSender,lHint,pHint);
}
}
从实现代码中可以看出,UpdateAllViews调用各视图的OnUpdate,OnUpdate会调用Invalidate(TRUE)刷新视图。
由于OnUpdate类是虚函数,所以会调用的是派生类的OnUpdate,可以根据需要,重写OnUpdate函数。
3.CView类的OnInitialUpdate()函数
新建或打开文档时,此函数会被调用,CView类的OnInitialUpdate()函数除了调用OnUpdate()函数之外,不做其他任何事情。
如果想对视图进行初始化,可以在CView的派生类的OnInitialUpdate()函数进行。
4.CDocument类的DeleteContens()函数
当文档关闭时,应用程序框架会自动调用此函数。
如果需要对文档进行清理操作,就可重写此函数。
1.1.5IDE
集成开发环境(IDE)比较复杂,它由以下几部分组成,最上面的是菜单和工具栏,左边的是工作空间窗口,右边是正文窗口,下面是输出窗口,如图1-14所示。
图1-14集成开发环境的组成
1.菜单
菜单命令非常多,但大部分菜单命令平时都用不到,表1-1列出了常用的菜单命令。
表1-1常用菜单命令
菜单命令
功能说明
File菜单
File→New
新建工程、文件、工作空间、文档
File→Open
打开文件
File→Close
关闭当前打开的文件。
File→OpenWorkspace
打开工作空间。
File→SaveWorkspace
保存工作空间。
File→CloseWorkspace
关闭工作空间
File→Save
保存当前文件
File→SaveAs
另存当前文件
File→SaveAll
保存所有打开的文件
File→RecentFiles
最近的文件列表
File→RecentWorkspace
最近的工作空间列表
File→Exit
退出集成开发环境
Edit菜单
Edit→Undo
撤销上一次的操作
Edit→Redo
恢复被取消的操作
Edit→Cut
剪切,将选中内容移到剪切板
Edit→Copy
复制,将选中内容放到剪切板中,原有内容不变
Edit→Paste
粘贴,将剪切板中的内容复制到目标处
Edit→Delete
删除
Edit→SelectAll
全选
Edit→Find
在当前文件中,查找指定的字符串
Edit→FindinFiles
在多个文件中查找指的字符串
Edit→Replace
在当前文件中,替换指定的串
View菜单
View→ClassWizard
打开类向导
View→Workspace
激活工作空间窗口
View→Output
激活输出窗口
Insert菜单
Insert→NewClass
创建新类并加入到工程中
Project菜单
Project→SetActiveProject
设置当前工程
Project→AddToProject→Files
为当前工程新增加文件
Project→Dependencies
设置依赖关系
Project→Settings
更改工程编译和调试设置
Build菜单
Build→Compile
编译当前源文件
Build→Build
编译和链接当前工程修改过的部分
Build→RebuildAll
重新编译和链接
Build→Clean
删除中间及输出文件
Build→StartDebug→Go
开始或继续调试程序
Build→StartDebug→StepInfo
单步调试
Build→Execute
创建并运行程序
Build→SetActiveConfiguration
选择当前工程及配置
Tool菜单
Tool→Customize
自定义,定制菜单工具
Tool→Options
属性,更改集成开发环境的设置
2.工具栏
第一次运行VisualC++6.0时,只显示了默认的标准工具栏。
除了标准工具栏以外,VisualC++6.0的集成开发环境中还显示与当前编辑器或当前工作空间有关的工具栏。
除此之外,不同类形的工程或不同的工作状态有不同的命令按钮被激活。
用户可以根据需要显示(隐藏)工具栏,具体方法如下。
(1)选择菜单“Tool→Customize”命令。
(2)在弹出的“Customize”对话框中,选择“Toolbars”属性页,如是某个工具栏被钩选,表示显示此工具栏,没有被钩选,表示隐藏此工具栏,图1-15中表示只显示“Menubar”和“Standard”两个工具栏。
图1-15显示隐藏工具栏
(3)设置完成后,单击“Close”按钮关闭对话框。
如果这些工具栏还不能满足需要,可以定制工具栏,具体步骤如下。
(1)选择菜单“Tool→Customize”命令。
(2)在弹出的“Customize”对话框中,选择“Commands”属性页。
在“Category”组合框中选择“Build”,然后在“Buttons”栏中把
直接拖到标准工具栏上,如图1-16所示。
此时自定义工具栏的效果如图1-17所示。
图1-16自定义工具栏
图1-17自定义工具栏的效果
这样,用户就可以方便地在“Win32Debug”和“Win32Release”之间进行切换。
说明:
“Win32Debug”主要用于调试代码,查找并改正错误代码,但进行调试的计算机上必须安装VisualC++;而“Win32Release”主要用于制作程序的发布版。
3.工作空间
工作空间有3个属性页,分别是类视图、资源视图、文件视图。
类视图显示类、全局函数、全局变量,如图1-18所示。
双击函数名,正文窗口会自动定位到函数的实现;双击类名、变量名,正文窗口会自动定位到类或变量的定义。
图1-18类视图
类视图管理本工程所有资源。
新增资源有两种方法,下面以增加对话框为例,新增其他资源的方法与此类似。
方法一,选中“Dialog”,单击鼠标右键,在弹出的快捷菜单中选择“InsertDialog”命令,如图1-19所示。
图1-19资源视图
方法二,选中任意节点,单击鼠标右键,在弹出的快捷菜单中选择“Insert”命令。
在弹出的“InsertResource”对话框中选择Dialog,单击“New”按钮,如图1-20所示。
图1-20新增加资源
直接双击要编辑的资源,就可以在正文窗口中编辑资源了。
选中要删除的资源,直接按“Delete”键盘就可以删除资源。
在文件视图中可以管理本工程的文件,既可以将某些文件加到本工程,也可以从本工程中删除一些文件。
选中某个文件夹,单击鼠标右键,在弹出的快捷菜单中选择中“AddFilestoFolder”命令,就可以为本文件夹增加文件了,如图1-21所示。
选中要删除的文件,再按“Delete”键就可以从文件视图中删除该文件了。
此时被删除的文件并没有放进回收站,只