02MFC基础文档格式.docx
《02MFC基础文档格式.docx》由会员分享,可在线阅读,更多相关《02MFC基础文档格式.docx(68页珍藏版)》请在冰豆网上搜索。
2.1.1组成
VisualC++提供了强大而灵活的集成开发环境,可用于创建基于Windows和.NET的应用程序。
VisualC++包含下列主要组件:
●VisualC++编译器工具。
支持MFC和STL等传统本机代码开发,还支持MC++(ManagedExtensionsforC++,C++的托管扩展)或C++/CLI的.NET(CLR)开发(将在16.5节中简介)。
除了支持传统的x86计算机外,还支持x64和IA-64等64位计算机,并针对这两种平台优化了性能。
●VisualC++库。
包括行业标准ATL(StandardTemplateLibrary,标准模板库,一套基于模板的C++类,可用来创建小型、快速的COM对象——ActiveX控件)、确定应用程序框架的MFC库,以及各种C/C++标准库,如iostream库、(用于泛型编程的)标准模板库(StandardTemplateLibrary,STL)和C运行时库(CRunTimelibrary,CRT)。
其中在CRT中还包括了微软公司的安全增强替代函数。
VC08中新引入的STL/CLR库,为托管代码开发人员引入了STL。
具有数据封送新功能的C++支持库,可简化面向CLR的程序。
CRT、iostream和STL已经在C++编程中介绍过。
因为COM即将被.NET组件所代替,加上篇幅的限制,因此本课程不介绍ATL。
●VisualC++开发环境。
该开发环境为项目管理与配置(包括更好地支持大型项目)、源代码编辑、源代码浏览和调试工具提供强力支持。
该环境还支持智能感知(IntelliSense),在编写代码时,该功能可以提供智能化且特定于上下文的建议。
除常规的图形用户界面应用程序外,VisualC++还允许开发人员生成Web应用程序、基于Windows的智能客户端应用程序以及适用于瘦客户端和智能客户端移动设备的解决方案。
VisualC++的具体组成部分有:
●C/C++编译器:
支持ANSIC和ISO/IECC++源代码的编译(VC2012还支持C++的最新国际标准C++11),支持STL,另外还带有微软的扩展(MC++或C++/CLI、C++/CX、STL/CLR)。
●源代码编辑器:
支持语法着色、自动缩进、完美打印、智能感知和自动完成(键入部分语句后编辑器会自动提供可能的完整语句供你选择,从而不需死记几千个函数和常数,也不必过分依赖于联机帮助)。
●属性编程:
VS.NET为VC引入了基于属性的编程方法(可选“视图\其他窗口\属性窗口”菜单项来打开属性窗口),可以自动生成各种代码,大大简化开发的过程。
如可轻松地派生新类、编辑资源、添加事件/消息响应函数等。
●资源编辑器:
可视编程环境,可用来编辑对话框、位图、图标、字符串等资源。
●资源编译器:
从资源编辑器或资源源文件(*.rc)中读取ASCII码的资源脚本,输出一个可供链接程序用的二进制文件(*.res)。
●链接程序:
读取C/C++编译器输出的目标文件(*.obj)和资源编译器输出的二进制文件(*.res),并为MFC代码、运行库代码和Windows代码访问LIB文件,最后生成可执行程序文件(*.exe)。
●调试程序:
可设置/删除断点、控制单步执行、查看所有派生类和基类的数据成员、观察栈/内存/变量、动态修改程序代码和变量值。
●MFC应用程序向导(AppWizard):
一个基本代码自动生成器,根据程序员在对话框选择和指定的相关内容,VC自动创建一个带有特性、类名和源代码文件名的Windows应用程序框架,使你能迅速开始一个应用程序的实质性设计。
●联机帮助:
如安装了MSDN(MicrosoftDeveloperNetworkLibrary,微软开发人员网络图书馆),可选“帮助”菜单中的菜单项“目录”(内容目录)、“搜索”(关键词全文查找)、“索引”(前向一致标题文本串匹配)等获得帮助,也可按F1键获得当前位置的上下文相关帮助。
MSDN内容丰富(可达近30GB),包含使用VC编程所需要的WindowsSDK、MFC、C++、C#、VB、.NET/CLR等的几乎所有参考资料和示教、编程指南等。
与使用C++编写基于命令行的控制台程序最大的不同是,利用VisualC++编写(具有GUI)的Windows应用程序,带有菜单、工具条、对话框、图标、位图、字符串、加速键等资源。
因此,在VisualC++的开发环境中,除了代码编辑器和编译器外,还有各种资源编辑器和资源链接器。
编译后的二进制资源被链接器嵌入到可执行程序中,既在控制台程序的代码段、数据段和堆栈段之外,Windows应用程序还多了一个资源段。
图2-1是VisualC++(MFC)应用程序的创建和编译过程。
2.1.2版本
下面列出VisualC++及对应MFC的所有主要版本:
●1992年2月MSC/C++7.0(MFC1.0)
●1993年2月VisualC++1.0(MFC2.0)
●1993年12月VisualC++1.5(MFC2.5)
●1994年9月VisualC++2.0(MFC3.0)
●(没有VisualC++3.0)
●1995年7月VisualC++4.0(MFC4.0)
●1996年3月VisualC++4.1(MFC4.1)
●1996年6月VisualC++4.2(MFC4.2)
●1997年1月VisualC++5.0(MFC4.21)
图2-1VisualC++的MFC应用程序的创建和编译过程
●1998年6月VisualC++6.0(MFC6.0)
●2002年2月VisualC++.NET(MFC7.0)
●2003年5月20日VisualC++.NET2003(MFC7.1)
●2005年11月7日VisualC++2005(MFC8.0)
●2007年11月16日VisualC++2008(MFC9.0)
●2008年4月7日VisualC++2008功能包(FeaturePack)(MFC9.0FP)
●2008年8月11日VisualC++2008SP1(含MFC9.0FP)
●2010年4月12日VisualC++2010(MFC10.0)
●2011年3月3日VisualC++2010SP1(MFC10.0SP)
●2012年9月12日VisualC++2012(MFC11.0)
●2013年10月18日VisualC++2013(MFC12.0)
最早的MFC1.0,是随MSC/C++7.0于1992年2月的,还没有IDE、应用程序框架和VisualC++,后来才随微软的可视开发平台VisualWorkbench推出VisualC++。
到VisualC++2.0,已经基本成熟。
为了使VisualC++的版本号与MFC的一致,微软跳过了VisualC++3.0而直接升级到VisualC++4.0。
从VisualC++4.0开始,直到VisualC++2008,MFC类库和基本编程都变化不大,开发环境也类似。
只是为了进行.NET的CLR托管编程,从VisualC++.NET(2002)开始,微软对C++的语法进行了托管扩展——MC++,从VisualC++2005版起又改为C++/CLI。
在VisualC++2008和.NET框架3.5中,增加了托管的泛型编程库STL/CLR。
不过(包括在VisualStudio2008SP1中的)MFCFeaturePackforVisualC++2008(MFC的VisualC++2008功能包,简称为MFC功能包)中,引入了众多的新界面元素和功能(如功能区、可视主题、Aero界面),增加了两百多个新的MFC类。
在VisualC++2010中,还增加了功能区的交互可视编程功能和支持多核编程的PPL(ParallelPatternsLibrary,并行模式库)。
而在VisualC++2012中,又增加了用XAML和C++/CX(ComponentExtension,组件扩展)编写Metro风格的应用程序及游戏和利用高效GPU提高应用程序性能的C++AMP(AcceleratedMassiveParallelism,加速的大量并行)库等新功能:
●编写符合C++11语言标准的代码。
●使用C++创建Windows应用商店应用程序和游戏。
●在多个处理器可用时,可对应用程序进行配置,以更快速、高效地运行。
●使用多核CPU对应用程序进行配置,以更快速地运行。
●利用高效GPU提高性能。
本课程的VC部分,采用VisualC++2012(简称为VC12)中文旗舰版作为教学版本,主要内容为传统Windows应用程序的MFC编程。
课件中的大部分MFC程序代码也适用于老版本的VisualC++6.0/.NET/2005/2008/2010(项目需要自动转换,而且对6.0版的老程序可能还需要修改项目属性中的字符集设置——从默认的“使用Unicode字符集”改为“使用多字节字符集”)。
本课程中的所有例子都在Windows7SP1的64位中文旗舰版下运行通过。
2.1.3编程平台
VisualC++编程平台可以开发多种Windows应用程序,还能为用户项目自动创建若干相关目录和各种有关文件。
1.开发种类
VC主要可以开发下列四类程序:
●Win32:
直接使用C/C++语言和Win32/64API来开发传统的Windows应用程序(本章会略有涉及,以后将不再介绍)。
●MFC:
使用MFC类库来开发C++语言的Windows应用程序(是本课程讲授的重点内容)。
●ATL:
使用ATL来为开发COM(ComponentObjectModel,组件对象模型)对象——ActiveX控件(本课程不讲,只会在16.2.3小节的组件编程中,简介使用现有ActiveX控件进行应用编程)。
●CLR:
使用MC++或C++/CLI开发基于.NET框架类库的CLR程序(本课程不讲,只介绍如何使用VisualC#来进行.NET编程)。
VC还可以用于开发本地应用程序(常规)和包含测试的项目(测试),参见图2-2。
图2-2VisualC++可创建的新项目种类
2.解决方案与项目
VC开发环境把应用程序放在解决方案(solution)中管理(解决方案对应于文件*.sln),一个解决方案中可以有多个项目(project,工程)(项目对应于文件*.vcproj或*.vcxproj),每个项目对应于一个应用程序(application)、动态链接库(DLL)、或COM组件(如ActiveX控件)。
可通过双击sln文件或vcxproj文件来启动VS/VC并装入对应的解决方案和项目。
在开发过程中,VC会自动创建若干目录(参见表2-1)和多种文件(参见表2-2)。
其中的解决方案目录,用于多个项目的联合开发,在本课程中没有使用。
可以在创建新项目时,去选“新建项目”对话框右下部的“为解决方案创建目录”复选框,以避免多创建(对简单程序是多余的)一层解决方案项目,从而简化开发。
表2-1VC自动创建的目录
目录名
说明
用户命名的程序名
解决方案目录(可无)
项目目录(为解决方案目录的子目录)
Debug
调试目录(为解决方案和项目目录的子目录)
Release
发行目录(为解决方案和项目目录的子目录)
res
资源目录(为项目目录的子目录)
ipch
用于智能感知的预编译头文件目录
(为解决方案或项目目录的子目录,是VC10新增加的)
x64
64位应用程序目录(包含Debug和Release子目录)
表2-2VC自动创建的文件类型(按字母升顺序排列)
扩展名
所在目录
bmp
位图(工具条位图Toolbar.bmp)
cpp
项目
C++源代码
dep
Debug|Release
清单依存(mt.dep,VC10无)
exe
可执行文件
h
头文件
ico
图标
idb
最小重建依存
ilk
增量连接器
lastbuildstate
最后生成状态(VC10新引进)
log
日志(老版本为生成日志BuildLog.htm)
manifest
程序清单(XML文档)
sdf
方案|项目
智能感知数据库(老版本为ncb)
obj
编译后的对象
pch
预编译头文件
pdb
程序调试数据库
rc
项目|Debug|Release
资源脚本
rc2
非VC资源编辑器生成的资源脚本
已编译的资源脚本
sln
解决方案
suo
解决方案用户选项
tlog
模板日志(命令和读写等,VC10新引进)
txt
文本(ReadMe.text)
user
项目用户选项
vcxproj
VC项目(XML文档,老版本为vcproj)
在这些目录和文件中,只有方案和项目目录及其中的*.sln、*.vcxproj、*.h、*.cpp、*.rc等文件和整个res子目录是编译所必须的,其他目录和文件都可以由VC自动重新生成。
因此,为了节省存储空间,在保存和上交MFC程序的项目源代码时,不须保留占用大量空间的Debug、Release和ipach等目录和*.sdf等文件。
3.窗口组成
VS/VC开发平台的主窗口(括号中为所在位置)由如下几个部分组成(参见图2-3):
图2-3VisualC++2012的界面
●标题条(顶):
显示当前开发的应用程序名,形为:
应用程序名—MicrosoftVisualStudio。
●菜单栏(上):
包含文件、视图、项目、生成、调试、工具、测试、窗口、社区、帮助等菜单,可完成VS/VC的所有功能。
●工具条(上):
包含若干图形按钮和下拉式列表框,对应于某些常用的菜单项或命令的功能,简单形象,可方便用户操作。
●项目工作区(中左):
包含解决方案资源管理器、类视图、属性管理器、资源视图等多个页面,用于组织和选择项目、文件、类和资源,配置项目属性等。
●编辑区(中中):
用于程序的源代码和资源的编辑,含起始页。
●属性/工具区(右边):
包含属性窗口、工具箱等可以滑出的隐藏页面。
●输出区(中下):
包含输出、代码定义窗口和调用浏览器等页面,用于显示操作的结果和出错信息、相关定义和帮助信息等。
●状态条(底):
显示当前操作或所选菜单/图标的提示信息。
注意:
在第一次启动VS时,可以选择一种开发环境的种类,常用的是“VisualC++开发设置”、“VisualC#开发设置”和“常规开发设置”。
也可以在以后的开发过程中,通过选择“工具\导入和导出设置”菜单项,打开“导入和导出设置向导”对话框,来重新设置开发环境的种类,包括导入已有的设置、导出当前的设置、或重置为某种语言工具的默认设置,参见图2-4。
图2-4重置VS的开发环境的种类
上面描述的是“VisualC++开发设置”的默认环境。
VS的开发环境还可以通过手工拖动、钉住等操作,或选择“视图”菜单中的各种菜单项来进行修改和调整。
4.命令操作方法
与其他应用程序一样,在VS/VC中,同样的操作可以用三种不同的方法来完成:
●选菜单项:
功能全、层次多、操作慢,如“调试\启动调试”。
●按工具条上的图标按钮:
形象、较快、功能不全,如
。
●按快捷健:
快、开始时难记、功能不太全,如F5。
有工具条按钮的菜单项的左边有对应的按钮图标,有快捷健的菜单项的右边还写有快捷(组合)健,如调试菜单中的启动调试菜单项形为
2.1.4宽字符
由于WindowsNT/2000/XP/Vista/7/8的系统内部采用的都是Unicode字符编码,所有字符(包括ASCII字符和汉字)都使用双字节编码。
所以在VisualC++和MFC编程中,一般需要使用双字节的宽字符类型wchar_t和对应的字符数组及其指针类型。
微软还为Win32API定义了若干与宽字符有关的typedef类型(如WCHAR和LPWSTR)。
宽字符类型和函数是C和C++标准(ANSI/ISO/IECC1999和ISO/IECC++1998/2003)新增加的内容,用于支持国际通用的Unicode(1993)字符集。
微软公司从VisualC++2005版起,开始严格执行C++的最新国际标准。
安全CRT函数是微软公司对C/C++语言的扩展(以防止字符串越界),其中的部分内容已于2003年提交给ISO作为C/C++标准下一版本的修改建议。
在VC10中,如果不使用这些安全性函数(一般在原函数后添加“_s”后缀,并增加了一个字符缓冲区大小参数)或对应的CRT函数没有字符计数参数,编译器就会报告警告性错误。
在MFC编程中,一般需要使用双字节的字符类型wchar_t和对应的字符串及其指针类型LPCWSTR和LPCTSTR,并在常数字符串前添加了L转换运算符,串长计算函数不能用strlen而改用wcslen,串格式打印函数也不能用sprintf,而是改用swprintf或swprintf_s,其中的字符和串格式符也从%c和%s改为%lc和%ls。
例如:
wchar_t*wstr=L"
Astringtoawidecharacterstring."
;
intn=wcslen(wstr);
wchar_tbuf[80];
//原始CRT版本,编译时会发出警告:
//swprintf(buf,L"
Yourstringis:
%ls"
wstr);
//警告
//有字符计数的CRT版本,编译时不会发出警告:
swprintf(buf,80,L"
//正确
//微软安全版本,编译时也不会发出警告:
//swprintf_s(buf,80,L"
1.宽字符类型
wchar_t类型,在标准C++中为内置的数据类型和关键字,在C标准中则只是typedef类型。
类型名wchar_t源于widecharactertype(宽字符类型),而后缀_t为C语言对typedef类型的一种命名约定。
为了与C语言和旧代码兼容,在C++标准中保留了该类型名。
wchar_t数据类型的具体实现与各个C/C++编译器有关,在Win32/64和VC中定义为:
typedefunsignedshortwchar_t;
(16位的双字节无符号短整数)
为了实现跨平台(如Win16/32/64),在WindowsAPI中重新定义了多种数据类型。
下面是在Win32API中定义的与(宽)字符有关的部分常用typedef类型:
typedefcharCHAR;
//普通字符类型
typedefCHAR*PCHAR,*LPCH,*PCH;
typedefCONSTCHAR*LPCCH,*PCCH;
typedefCHAR*NPSTR,*LPSTR,*PSTR;
typedefCONSTCHAR*LPCSTR,*PCSTR;
typedefwchar_tWCHAR;
//宽字符类型
typedefWCHAR*PWCHAR,*LPWCH,*PWCH;
typedefCONSTWCHAR*LPCWCH,*PCWCH;
typedefWCHAR*NWPSTR,*LPWSTR,*PWSTR;
typedefCONSTWCHAR*LPCWSTR,*PCWSTR;
#ifdefUNICODE//使用Unicode字符
typedefWCHARTCHAR,*PTCHAR;
typedefLPWCHLPTCH,PTCH;
typedefLPWSTRPTSTR,LPTSTR;
typedefLPCWSTRPCTSTR,LPCTSTR;
typedefLPWSTRLP;
#else//不使用Unicode字符
typedefcharTCHAR,*PTCHAR;
typedefLPCHLPTCH,PTCH;
typedefLPSTRPTSTR