windows编程技术02MFC基础Word格式.docx
《windows编程技术02MFC基础Word格式.docx》由会员分享,可在线阅读,更多相关《windows编程技术02MFC基础Word格式.docx(73页珍藏版)》请在冰豆网上搜索。
VisualC++提供了强大而灵活的集成开发环境,可用于创建基于Windows和.NET的应用程序。
VisualC++包含下列主要组件:
●VisualC++编译器工具。
支持MFC和STL等传统本机代码开发,还支持MC++(ManagedExtensionsforC++,C++的托管扩展)或C++/CLI的.NET(CLR)开发。
除了支持传统的x86计算机外,还支持x64和IA-64等64位计算机,并针对这两种平台优化了性能。
●VisualC++库。
包括行业标准ATL(StandardTemplateLibrary,标准模板库,一套基于模板的C++类,可用来创建小型、快速的COM对象——AcyiveX控件)、确定应用程序框架的MFC库,以及各种C/C++标准库,如iostream库、(用于泛型编程的)标准模板库(StandardTemplateLibrary,STL)和C运行时库(CRunTimelibrary,CRT)。
其中在CRT中还包括了微软公司的安全增强替代函数。
VC08中新引入的STL/CLR库,为托管代码开发人员引入了STL。
具有数据封送新功能的C++支持库,可简化面向CLR的程序。
●VisualC++开发环境。
该开发环境为项目管理与配置(包括更好地支持大型项目)、源代码编辑、源代码浏览和调试工具提供强力支持。
该环境还支持智能感知(IntelliSense),在编写代码时,该功能可以提供智能化且特定于上下文的建议。
除常规的图形用户界面应用程序外,VisualC++还允许开发人员生成Web应用程序、基于Windows的智能客户端应用程序以及适用于瘦客户端和智能客户端移动设备的解决方案。
VisualC++的具体组成部分有:
●C/C++编译器:
支持ANSIC和ISO/IECC++源代码的编译,支持STL,另外还带有微软的扩展(MC++或C++/CLI)。
●源代码编辑器:
支持语法着色、自动缩进、完美打印、智能感知和自动完成(键入部分语句后编辑器会自动提供可能的完整语句供你选择,从而不需死记几千个函数和常数,也不必过分依赖于联机帮助)。
●属性编程:
VS.NET为VC引入了基于属性的编程方法(可选“视图\其他窗口\属性窗口”菜单项来打开属性窗口),可以自动生成各种代码,大大简化开发的过程。
如可轻松地派生新类、编辑资源、添加事件/消息响应函数等。
●资源编辑器:
可视编程环境,可用来编辑对话框、位图、图标、字符串等资源。
●资源编译器:
从资源编辑器或资源源文件(*.rc)中读取ASCII码的资源脚本,输出一个可供链接程序用的二进制文件(*.res)。
●链接程序:
读取C/C++编译器输出的目标文件(*.obj)和资源编译器输出的二进制文件(*.res),并为MFC代码、运行库代码和Windows代码访问LIB文件,最后生成可执行程序文件(*.exe)。
●调试程序:
可设置/删除断点、控制单步执行、查看所有派生类和基类的数据成员、观察栈/内存/变量、动态修改程序代码和变量值。
●MFC应用程序向导(AppWizard):
一个基本代码自动生成器,根据程序员在对话框选择和指定的相关内容,VC自动创建一个带有特性、类名和源代码文件名的Windows应用程序框架,使你能迅速开始一个应用程序的实质性设计。
●联机帮助:
如安装了MSDN(MicrosoftDeveloperNetworkLibrary,微软开发人员网络图书馆),可选“帮助”菜单中的菜单项“目录”(内容目录)、“搜索”(关键词全文查找)、“索引”(前向一致标题文本串匹配)等获得帮助,也可按F1键获得当前位置的上下文相关帮助。
MSDN内容丰富(可达2.5GB),包含使用VC编程所需要的WindowsSDK、MFC、C++、.NET/CLR的几乎所有参考资料和示教、编程指南等。
与使用C++编写基于命令行的控制台程序最大的不同是,利用VisualC++编写(具有GUI)的Windows应用程序,带有菜单、工具条、对话框、图标、位图、字符串、加速键等资源。
因此,在VisualC++的开发环境中,除了代码编辑器和编译器外,还有各种资源编辑器和资源链接器。
编译后的二进制资源被链接器嵌入到可执行程序中,既在控制台程序的代码段、数据段和堆栈段之外,Windows应用程序还多了一个资源段。
图2-1是VisualC++(MFC)应用程序的创建和编译过程。
图2-1VisualC++的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)
●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年春计划推出VisualC++2010(MFC10.0)
最早的MFC1.0,是随MSC/C++7.0于1992年2月的,还没有IDE、应用程序框架和VisualC++,后来才随微软的可视开发平台VisualWorkbench推出VisualC++。
到VisualC++2.0,已经基本成熟。
为了使MFC的版本号与VisualC++的一致,微软跳过了VisualC++3.0而直接升级到4.0。
从VisualC++4.0开始,直到VisualC++2008,MFC类库和基本编程都变化不大,开发环境也类似。
只是为了进行.NET的CLR托管编程,从VisualC++.NET开始,微软对C++的语法进行了托管扩展——MC++,从VisualC++2005版起又改为C++/CLI。
不过(包括在VisualStudio2008SP1中文版中的)MFCFeaturePackforVisualC++2008(MFC的VisualC++2008功能包,简称为MFC功能包)中,引入了众多的新界面元素和功能(如功能区、可视主题、Aero界面),增加了两百多个新的MFC类。
本书的VC部分,采用VisualC++2008(简称为VC08)SP1中文专业版作为教学版本,主要内容为传统Windows应用程序的MFC编程。
书中的大部分MFC程序代码也适用于老版本的VisualC++6.0/.NET/2005(项目需要自动转换,而且可能需要修改项目属性中的字符集设置——从默认的“使用Unicode字符集”改为“多字节字符集”)。
本书中的所有例子都在WindowsXPSP3中文版下运行通过。
2.1.3编程平台
VisualC++编程平台可以开发多种Windows应用程序,还能为用户项目自动创建若干相关目录和各种有关文件。
1.开发种类
VC主要可以开发下列四类程序:
●Win32:
直接使用C/C++语言和Win32/64API来开发传统的Windows应用程序(本章会略有涉及,以后将不再介绍)。
●MFC:
使用MFC类库来开发C++语言的Windows应用程序(是本书讲授的重点内容)。
●ATL:
使用ATL来为开发COM(ComponentObjectModel,组件对象模型)对象——ActiveX控件(本书不讲,只会在组件编程中简介使用已有的ActiveX控件进行应用编程)。
●CLR:
使用MC++或C++/CLI开发基于.NET框架类库的CLR程序(本书不讲,只介绍如何使用VisualC#来进行.NET编程)。
VC还可以用于开发本地应用程序的空项目(常规)、用于WindowsMobile和其他基于WindowsCE设备的使用MFC的项目(智能设备)、包含测试的项目(测试),参见图2-2。
2.解决方案与项目
VC开发环境把应用程序放在解决方案(solution)中管理(解决方案对应于文件*.sln),一个解决方案中可以有多个项目(project,工程)(项目对应于文件*.vcproj),每个项目对应于一个应用程序(application)、动态链接库(DLL)、或COM组件(如ActiveX控件)。
可通过双击sln文件或vcproj文件来启动VS/VC并装入对应的解决方案和项目。
图2-2VisualC++可创建的新项目种类
在开发过程中,VC会自动创建若干目录(参见表2-1)和多种文件(参见表2-2):
表2-1VC自动创建的目录
目录名
说明
用户命名的程序名
解决方案目录(可无)
项目目录(为解决方案目录的子目录)
Debug
调试目录(为项目目录的子目录)
Release
发行目录(为项目目录的子目录)
res
资源目录(为项目目录的子目录)
表2-2VC自动创建的文件类型(按字母升顺序排列)
扩展名
所在目录
bmp
位图(工具条位图Toolbar.bmp)
cpp
项目
C++源代码
dep
Debug|Release
清单依存(mt.dep)
exe
可执行文件
h
头文件
htm
网页(生成日志BuildLog.htm)
ico
图标
idb
最小重建依存
ilk
增量连接器
manifest
程序清单(XML文档)
ncb
方案|项目
智能感知数据库
obj
编译后的对象
pch
预编译头文件
pdb
程序调试数据库
rc
资源脚本
rc2
非VC资源编辑器生成的资源脚本
已编译的资源脚本
sln
解决方案
suo
解决方案用户选项
txt
文本(ReadMe.text)
user
项目用户选项
vcproj
3.窗口组成
VS/VC开发平台的主窗口由如下几个部分组成(参见图2-3):
●标题条(顶):
显示当前开发的应用程序名,形为:
应用程序名—MicrosoftVisualStudio
●菜单栏(上):
包含文件、视图、项目、生成、调试、工具、测试、窗口、社区、帮助等菜单,可完成VS/VC的所有功能
●工具条(上):
包含若干图形按钮和下拉式列表框,对应于某些常用的菜单项或命令的功能,简单形象,可方便用户操作。
●项目工作区(中左):
包含解决方案资源管理器、类视图、属性管理器、资源视图等多个页面,用于组织和选择项目、文件、类和资源,配置项目属性等。
●编辑区(中右):
用于程序的源代码和资源的编辑,含起始页
●工具区(右边):
包含工具箱、服务器资源管理器等可以滑出的隐藏页面
●输出区(下):
包含输出、代码定义窗口和调用浏览器等页面,用于显示操作的结果和出错信息、相关定义和帮助信息等
●状态条(底):
显示当前操作或所选菜单/图标的提示信息
图2-3VisualC++2008的界面
注意:
在第一次启动VS时,可以选择一种开发环境的种类,常用的是“VisualC++开发设置”和“常规开发设置”。
也可以在以后的开发过程中,通过选择“工具\导入和导出设置”菜单项,打开“导入和导出设置向导”对话框,重新设置开发环境的种类。
上面描述的是“VisualC++开发设置”的默认环境。
环境可以通过手工拖动、钉住等操作,或选择“视图”菜单中的各种菜单项来进行修改和调整。
4.命令操作方法
与其他应用程序一样,在VS/VC中,同样的操作可以用三种不同的方法来完成:
●选菜单项:
功能全、层次多、操作慢,如“调试\启动调试”
●按工具条上的图标按钮:
形象、较快、功能不全,如
●按快捷健:
快、开始时难记、功能不太全,如F5
有工具条按钮的菜单项的左边有对应的按钮图标;
有快捷健的菜单项的右边写有快捷(组合)健。
2.1.4宽字符
由于WindowsNT/2000/XP/Vista/7的系统内部采用的都是Unicode字符编码,所有字符(包括ASCII字符和汉字)都使用双字节编码。
所以在VisualC++和MFC编程中,一般需要使用双字节的宽字符类型wchar_t和对应的字符数组及其指针类型。
微软还为Win32API定义了若干与宽字符有关的typedef类型。
宽字符类型和函数是C和C++标准(ANSI/ISO/IECC1999和ISO/IECC++1998/2003)新增加的内容,用于支持国际通用的Unicode(1993)字符集。
微软公司从VisualC++2005版起,开始严格执行C++的新标准。
安全CRT函数是微软公司对C/C++语言的扩展,其中的部分内容已于2003年提交给ISO作为C/C++标准下一版本的修改建议。
在VC08中,如果不使用这些安全性函数,编译器会报告警告性错误。
在MFC编程中,一般需要使用双字节的字符类型wchar_t和对应的字符串及其指针类型LPCWSTR和LPCTSTR,并在常数字符串前添加了L转换运算符,串长计算函数不能用strlen而改用wcslen,串格式打印函数也不能用sprintf,而是改用swprintf_s,其中的字符和串格式符也从%c和%s改为%lc和%ls。
例如:
wchar_t*wstr=L"
Astringtoawidecharacterstring."
;
intn=wcslen(wstr);
wchar_tbuf[80];
swprintf_s(buf,80,L"
Yourstringis:
%ls"
wstr);
1.宽字符类型
wchar_t类型,在标准C++中为内置的数据类型和关键字,在C标准中则只是typedef类型。
类型名wchar_t源于widecharactertype(宽字符类型),而后缀_t为C语言对typedef类型的一种命名约定。
为了与C语言和旧代码兼容,在C++标准中保留该类型名。
wchar_t数据类型的具体实现与各个C/C++编译器有关,在Win32和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,LPTSTR;
typedefLPCSTRPCTSTR,LPCTSTR;
#endif/*UNICODE*/
可见,在Win32API中,普通字符类型char被重新定义为CHAR、宽字符类型wchar_t被重新定义为WCHAR、当前字符类型被定义为TCHAR。
至于TCHAR,到底是普通字符类型还是宽字符类型,则由应用程序项目的字符集属性来决定。
当字符集属性取值为“使用Unicode字符集”(ASCII字符和汉字都用两个字节表示)时,TCHAR就是宽字符类型;
当字符集属性取值为“使用多字节字符集”(ASCII字符用一个字节表示,而汉字则用三个字节表示)时,TCHAR就是普通字符类型。
定义类型LPTSTR(和LPCTSTR)分别是当前字符串类型(常量)的32位长指针,对应的原文为:
LongPointertoa(Constant)TypeofSRTing,它们经常出现在MFC类成员函数的参数类型中。
字符集属性可以在创建项目时的“MFC应用程序向导”对话框的“应用程序类型”页中,通过选中或去选“使用Unicode库”复选框来设置,参见图2-4。
图2-4MFC应用程序向导对话框中的使用Unicode库复选框
也可以在创建项目后,通过选中“项目”菜单的“*属性”(其中*为具体的项目名,下同)菜单项,打开“*属性页”对话框,然后在“配置属性”的“常规”属性选卡中的“字符集”选项中进行选择来确定,参见图2-5。
图2-5项目属性页中的字符集选项
2.L转换符和打印格式符
为了将普通字符(串)转换成宽字符(串),可在常数字符(串)前添加了L转换运算符。
wchar_twch=L'
C'
*wstr=L"
普通字符串转换为宽字符串"
MessageBox(L"
内存分配出错!
"
L"
错误"
);
在诸打印函数中,字符(串)变量所对应的字符和串格式符也从普通字符的%c和%s改为宽字符的%lc和%ls。
字符串为:
“%ls”,字符为‘%lc’"
wstr,wch);
MessageBox(buf);
3.宽字符函数
下面是若干常用的宽字符函数(包含在ISOC99/ISOC++的标准库中,其中的errno_t和size_t被分别定义成int和unsignedint类型):
#include<
wchar.h>
size_twcslen(constwchar_t*s);
//获取宽字符数组中的字符个数
intwprintf(constwchar_t*format,...);
//格式化打印(显示)输出
intwscanf(constwchar_t*format,...);
//格式化键盘输入
//格式化串输出和输入:
intswprintf(wchar_t*s,size_tn,constwchar_t*format,...);
intswscanf(constwchar_t*s,constwchar_t*format,...);
//宽字符串转换为长整数、浮点数和双精度数:
longintwcstol(constwchar_t*nptr,wchar_t**endptr,intbase);
floatwcstof(constwchar_t*nptr,wchar_t**endptr);
doublewcstod(constwchar_t*nptr,wchar_t**endptr);
#incl