第一篇VisualC++2008基础知识第1章开始使用VisualC++2008在VisualC++2008中可以采用多种方式编写Windows应用程序,既可以编写基于本地C++的Windows程序,也可以在托管环境下开发Windows程序.
在接触Windows编程之前,必须熟悉C++编程语言,特别是C++语言的面向对象功能.
本章主要概述了C++编程涉及到的一些基本概念,以及C++的集成开发环境VisualStudio2008的使用.
了解.
NETFramework3.
5的概念熟悉C++应用程序创建控制台应用程序编译、连接并执行C++控件台应用程序创建并执行基本的Windows应用程序1.
1.
NETFramework3.
5.
NETFramework是VisualC++2008以及微软所有其他.
NET开发产品的核心,它是微软近年来主推的应用程序开发框架,该框架提供跨平台和跨语言的特性.
使用.
NETFramework,并配合其集成开发环境VisualStudio,开发人员可以比以往更轻松地创建出功能强大的应用程序.
1.
1.
1什么是.
NETFramework现在的计算机编程语言的执行方式分为两种,一种是编译执行,一种是解释执行.
编译执行是指源程序代码先由编译器编译成可执行的机器码,然后再执行;解释执行是指源代码程序被解释器直接读取执行.
上面这些都是比较传统的程序代码执行方式,从Java语言开始,一种新的程序语言执行方式产生了,这就是"中间码+虚拟机"执行机制.
在这种执行方式中,程序语言源代码需要被编译成一种特殊的中间码,这种中间码是不能直接在机器上执行的,它需要一个叫"虚拟机"的装置来管理和执行,虚拟机可以是解释执行,也可以是编译执行.
因为"虚拟机"可以参与和管理程序代码的执行,因此解决了很多传统编译语言一些致命的缺点,如垃圾内存回收、安全性检查和跨平台等.
正因为Java有如此优点,微软也采用了这种执行方式,.
NETFramework类似于管理和执行中间码的"虚拟机".
需要注意,.
NETFramework和Java的虚拟机JVM是不完全相同的,Java的虚拟机是解释执行的,而.
NETFramework是编译执行的.
另外,.
NETFramework作为开发应用程序的一个框架,它对操作系统进行封装,需要使用.
NETFramework开发的应用程序与操作系统特性隔离开来.
这样,.
NETFramework开发的应用程序就可以移植到许多不同的硬件和操作系统上.
事实上,.
NETFramework的主要特色在于简化应用程序开发的复杂性.
它提供了一致的开发模型,开发人员可以选择任何支持.
NET的编程语言来进行多种类型的应用程序开发,例如VisualBasic.
NET、C#和C++.
NET.
.
NETFramework由两个主要部分组成:CLR(CommonLanguageRuntime,公共语言运行库)和一组供使用的.
NETFramework类库.
1.
1.
2公共语言运行库CLR公共语言运行库CLR是标准化的程序执行环境.
这些可以在CLR中执行的程序可以是用各种高级语言编写的,比如VisualBasic、C#,以及C++.
现在CLR规范收录在ECMA(欧洲计算机制造)的CLI(通用语言基础结构)标准——ECMA-335中,并且CLI已经通过ISO认可,作为ISO/IEC23271的标准.
也就是说,CLR是微软对CLI的实现.
这也就是为什么将支持CLR的C++称为C++/CLI.
CLI本质上是一种虚拟机环境规范,这种环境规范使各种高级编程语言编写的应用程序能够在不同的系统环境中执行,而不用修改或重新编译原来的源代码.
CLI规定了一种供虚拟机使用的标准中间语言,高级语言源代码首先将被编译为这种语言.
在.
NETFramework中,这种中间语言称为MSIL(Microsoft中间语言)代码.
执行程序时,中间语言代码最终由JIT(Just-In-Time,实时)编译器编译为本地机器代码.
当然,CLI中间语言代码可以在任何实现CLI标准的环境中执行.
在开发应用程序时,使用一种高级语言编写的程序很难与使用另一种高级语言编写的程序进行数据交换,这是许多编程语言存在的一个共同问题.
为此,CLI定义了一组通用的数据类型——CTS(CommonTypeSystem,通用类型系统),在使用由CLI实现的编程语言编写程序时都应该使用该类型系统.
这样,CLI中的各种高级语言都会使用相同的数据类型系统,从而使得不同编程语言编写的组件以相同的方式处理数据,也可以使得将不同语言编写的组件集成到单个应用程序中.
CLR大大增强了数据的安全性和程序的可靠性.
因为在CLR中运行的程序是托管的,即CLR管理着应用程序,它会对程序的内存进行管理,并对程序执行的安全性进行检查等.
与此相反,不在CLR控制下运行应用程序是非托管的.
非托管程序可以直接访问操作系统的低级功能,对于托管程序则是通过CLR与操作系统通信.
1.
1.
3.
NETFramework类库关于类库的概念一直就存在,以前的VisualC++为MFC类库,Delphi的类库为VCL,Java的类库为Swing、AWT等.
这些类库封装了系统底层的功能并提供更好的操作方式.
.
NETFramework中的类库封装了对Windows、网络、文件、多媒体的处理功能,是所有.
NETFramework语言都必须使用的核心类库.
并且,为了便于语言之间进行交互操作,.
NETFramework类库中的类型都是符合公共类型系统CLS的.
使用类库可以创建多种类型的应用程序,极大简化了开发人员的学习曲线,提高了软件开发生产力.
1.
1.
4.
NETFramework3.
5的新功能从微软公司发布第一个.
NETFramework以来,已经陆续发布了1.
0版、1.
1版、2.
0版和3.
0版.
.
NETFramework3.
2版是目前最新的版本,也是功能最强大和完美的一个版本.
开发人员可以使用.
NETFramework创建Web程序、Windows以及智能设备应用程序等.
VisualC++2008所使用的.
NETFramework为3.
5版.
.
NETFramework3.
5版是以.
NETFramework2.
0版和.
NETFramework3.
0版为基础的,包括.
NETFramework2.
0和3.
0版的ServicePack.
.
NETFramework2.
0改进了.
NETFramework1.
1中的许多问题,并增加了如泛型、可空类型、匿名方法等新特性.
.
NETFramework3.
0则以.
NETFramework2.
0为基础,增加了3种全新的技术.
WindowsPresentationFoundation(WPF)Windows表现层技术.
WCFWindows通信技术.
WFWindows工作流开发技术.
.
NETFramework3.
5则以3.
0为基础,增加了对ASP.
NETAJAX的直接支持,并提供了语言集成查询LINQ技术以及一些附加的类库.
1.
2C++应用程序使用VisualC++2008可以开发两种类型的应用程序,即在CLR中执行的托管程序,也可以编写直接编译为机器代码的非托管程序.
就针对CLR的、基于窗口的托管应用程序而言,可以使用.
NETFramework类库提供的WindowsForms作为GUI基础.
使用WindowsForms可以快速开发GUI程序,因为VisualC++2008开发环境提供了直观的组件来开发GUI,而代码是完全自动生成的.
对于本地执行的非托管代码,则有多种方式可用.
一种是使用MFC(MicrosoftFoundationClassses,微软基本类)来编写Windows应用程序的图形界面.
MFC封装了Windows操作系统提供的用于创建Windows应用程序的API(ApplicationProgrammingInterface,应用程序编程接口),因此大大简化了程序的开发过程.
如果应用程序需要最佳性能,还直接使用WindowsAPI开发Windows应用程序.
由于托管C++是在CLR中执行的,其数据和代码都由CLR管理,所以在其中为数据动态分配的内存是自动释放的,这就消除了本地C++应用程序中常见的错误.
对于非托管的C++程序,因为CLR不参与这种代码的执行过程,因此程序员必须自己处理程序执行过程中分配与释放内存的各个方面.
另外,还得不到CLR提供的安全性检查.
非托管C++也被称为本地C++,因为其代码被直接编译为本地机器代码.
各种C++程序的特点如图1-1所示.
图1-1C++程序类型图1-1列出的程序类型之间并不是完全独立的.
应用程序可以部分代码采用托管C++,而另一部分则使用本地C++代码.
当然,混合使用代码会造成一些损失,因为托管代码组件与非托管代码组件之间通信可能会产生相当大的系统开销.
因此,只有当需要开发或扩展非托管代码,而又希望使用托管代码的优点时,混合两种代码才有意义.
对于新的应用程序而言,在最初就应该决定是否采用托管C++来开发程序.
为了以后学习的方便,需要全面理解C++,包括语言的本地C++和C++/CLI版本.
以下是VisualC++2008支持的两个独立标准定义的C++版本.
ANSI/ISOC++也称为标准C++,用于实现本地非托管的C++应用程序.
标准C++很早就出现了,多数计算机平台都支持该版本的C++.
ANSI/ISOC++一直是许多专业程序开发者的首选,而且目前仍然是功能最强大的编程语言之一.
C++/CLI运行在CLR中的托管C++,它是ISO/ASNIC++的扩展,以便更好地支持ECMA-335标准定义的CLI.
该标准是在2003年微软公司为了支持C++程序而在.
NETFramework内执行而提出的.
虽然C++/CLI是ISO/ANSIC++的扩展,但是如果希望程序完全在CLR控制下执行,那么有些ISO/ANSIC++的功能绝对是不能使用的.
1.
3VisualC++2008与VisualStudio2008本书使用VisualStudio2008进行所有的开发,包括简单的命令行应用程序,以及比较复杂的项目类型.
尽管VisualStudio2008不是开发C++应用程序所必需的,可以使用基本的文本编辑器(如常见的记事本程序)编辑C++源代码,再使用C++编译器对代码进行编译.
但使用VisualStudio2008可以使任务更简单一些.
VisualStudio2008是一个完整的开发环境.
VisualC++2008只是VisualStudio2008的一部分,在VisualStudio2008中还可以使用VisualBasic.
NET和VisualC#语言进行开发.
如果是第一次运行VisualStudio2008,则屏幕上会显示一个如图1-2所示的"选择默认环境设置"对话框.
在其中选择"VisualC++开发设置"选项,表示使用VisualC++的开发环境.
然后单击"启动VisualStudio"按钮,系统将花几分钟的时间使配置环境生效.
如果不是第一次运行VisualStudio2008,并且选择了另一个选项,为了将设置重置为VisualC++开发环境,可以在打开VisualStudio之后,选择"工具"菜单中的"导入和导出设置"选项,打开配置文档管理向导,如图1-3所示.
在该对话框中可以选择导出当前的环境设置,或导入选定的环境设置,这样通过导出配置文档,可以建立并共享自己的配置文件.
图1-2"选择默认环境设置"对话框图1-3配置文档管理向导为了重新设置当前的开发环境,选择"重置所有设置"选项,然后单击"下一步"按钮,屏幕上会出现如图1-4所示的对话框,这个画面有两个选项,一是保存现有设定,二是放弃保存现有设定.
用户可以按照自己的需要任意选择,然后单击"下一步"按钮.
接下来就会出现如图1-5所示的对话框,在其中可以重新选择默认的环境配置.
图1-4导入和导出设置图1-5重新选择默认环境配置由上可知,VisualStudio开发环境的布局是完全可定制的,但各个语言默认的设置比较适合各类语言的特点.
在C++的开发环境设置如下,其布局如图1-6所示.
图1-6VisualStudio2008集成开发环境在VisualStudio启动时,主窗口会默认显示一个介绍性的"起始页",该主窗口还会显示所有的代码.
这个窗口可以包含许多文档,每个文档都有一个标签,单击文件名,就可以在文件之间切换.
这个窗口也具有其他功能:它可以显示图形用户界面,该界面可用于设计项目,以及各种内置于VisualStudio的工具.
在主窗口的上面包含菜单栏和工具栏.
在工具栏中有几个非常重要的工具按钮,其功能可以实现保存和加载文件、编译和运行项目,以及调试控件等.
在以后需要这些工具栏时将会详细讨论它们.
下面简要描述VisualStudio中最常用的功能.
将鼠标指针放在"工具箱"上,就会显示"工具箱"工具栏,它们提供了Windows应用程序中常用的用户界面控件.
另一个标签是"服务器资源管理器",它包含了诸如数据源、服务器设置和服务等功能.
在主窗口的左侧窗口中,单击"解决方案资源管理器"标签,就会在窗口会显示当前加载的解决方案的信息.
解决方案是包含一个或多个项目及其配置的VisualStudio术语.
下面将专门对解决方案进行解释.
与"解决方案资源管理器"标签位于同一窗口的还包括"类视图"和"属性管理器"标签.
其中"类视图"标签可以显示当前项目中所包含的类,以及类所提供的方法等.
"属性管理器"标签可以显示窗体,以及窗体控件的设计属性.
在主窗口的底部是"输出"窗口,"输出"窗口会显示程序编译和链接时所产生的信息.
VisualStudio还可以显示许多其他窗口,它们都包含许多信息,有许多功能.
其中的一些窗口会与上面提及的窗口位于相同的位置,使用标签可以切换它们.
这些窗口并不需要专门进行记忆,在VisualStudio中开发程序时会经常使用它们.
下面介绍两个重要的概念——项目和解决方案.
项目是构成某个程序所需全部组件的容器,该程序可能是控制台程序、基于窗口的程序或者别的什么程序.
程序通常由一个或多个包含用户代码的源文件,可能还要附加其他包含辅助数据的文件组成.
某个项目的所有文件都存储在相应的项目文件夹中,关于该项目的详细信息存储在一个扩展名为.
vcproj的XML文件中,该文件同样存储在相应的项目文件夹中.
项目文件夹还包括其他文件夹,它们用来存储编译及连接项目所产生的输出文件.
解决方案的含义正如其名称,是一种将所有程序和其他资源聚集到一起的机制.
例如,在企业的信息管理系统中可能由若干个不同的程序组成,而各个程序可能是作为同一个解决方案内的项目开发的,因此,解决方案就是存储一个或多个有关项目的所有信息的文件夹,这样一个或多个项目文件夹就成为解决方案文件夹的子文件夹.
与某个解决方案中的项目有关信息被存储在扩展名为.
sln和.
suo的两个文件中.
当创建某个项目时,如果没有选择将该项目添加到现有的解决方案,则系统会自动创建一个新的解决方案.
一般来说,可以将任意种类的项目添加到现有的解决方案中,但通常只添加在某个方面与该解决方案内现有项目相关的项目.
本书所创建的各个实例都是其解决方案内的单个项目.
1.
4控制台应用程序控制台应用程序是基于字符的命令行应用程序,由于这些程序是用户在字符模式中通过键盘和屏幕与它们通信的,完全不需要Windows程序所需的元素.
即使简单的Windows程序中不会包含大量代码,这些代码也会分散学习C++时的注意力.
因此,本书在前面介绍C++基础时,均使用控制台应用程序.
由于C++包括ISO/ANSIC++和C++/CLI两个标准,所以可以创建两种不同的控制台应用程序.
Win32控制台应用程序编译为本地代码,通过这类程序可以测试ISO/ANSIC++的功能.
CLR控制台应用程序是针对CLR的,因此将在学习C++/CLI功能时使用.
1.
4.
1Win32控制台应用程序现在来看一下如何创建Win32控制台应用程序.
(1)首先选择"文件"|"新建"|"项目",打开如图1-7所示的"新建项目"对话框.
"新建项目"对话框的左侧窗口显示了可以创建的项目类型,在这个示例中选择Win32选项.
该操作同时也确定了为本项目创建初始内容的应用程序向导.
右侧窗口显示了可供左侧窗口中选定项目类型所使用的模板列表.
当创建构成项目的文件时,应用程序向导将使用选中的模板.
选择项目类型后,可以在"名称"编辑框中为该项目输入一个合适的名称,如Exce1_01.
VisualC++2008支持长文件名,这给用户很大的灵活性.
解决方案文件夹的名称出现在底部编辑框中,默认情况下,该名称与项目的名称相同.
当然,也可以修改解决方案名称.
在该对话框中,还可以修改包含本项目的解决方案的位置,这可以在"位置"编辑框中修改.
如果仅仅输入项目名称,则解决方案文件夹就自动被设置为与项目同名的文件夹,其存储路径显示在"位置"编辑框.
如果想为解决方案文件夹指定不同的路径,那么只需要在"位置"编辑框中输入新路径即可,另外还可以使用"浏览"按钮为解决方案选择其他路径.
(2)单击"确定"按钮,显示如图1-8所示的Win32应用程序向导.
图1-8Win32应用程序向导该向导对话框显示当前有效的设置.
如果单击"完成"按钮,则该向导将创建基于这些设置的所有项目文件.
也可以选择左边的"应用程序设置"选项,以显示该向导的应用程序设置页面,如图1-9所示.
图1-9应用程序设置在应用程序设置对话框中允许用户选择那些希望应用到本项目的选项.
大多数情况下,只需要在创建项目时选中"空项目"复选框.
但在本示例中将采用默认选项,并单击"完成"按钮,应用程序向导将会创建一个包含所有默认文件的项目.
(3)应用程序向导会自动生成完整的、可以编译和执行的Win32控制台程序.
但是,该程序运行时不做任何事情,因此用户需要根据自己的需要对其进行修改.
一般情况下,应用程序向导在生成项目后会自动在主窗口打开程序的源代码.
如果该程序源代码在主窗口是不可见的,则可以双击左侧"解决方案管理"窗口中的Exce1_01.
cpp.
该文件是应用程序向导为该程序生成的主要源文件,如图1-10所示.
图1-10主代码编辑窗口如果代码编辑窗口未显示行号,则可以通过主菜单选择"工具"|"选项",打开"选项"对话框.
然后展开右侧窗口中的"文本编辑器"|C/C++选项,从右侧窗口中选择"行号"选项.
显示行号可以方便用户确认编译过程出现错误的代码行.
现在修改程序,在命令提示符窗口中输入一行字符串.
#include"stdafx.
h"#include"iostream"int_tmain(intargc,_TCHAR*argv[]){std::cout^args){Console::WriteLine(L"第一个CLR控制台程序");return0;}(3)按Ctrl+F5键,可以编译并执行上面的程序.
其输出如图1-15所示.
图1-15CLR控制台程序运行效果1.
5创建Windows应用程序与典型的从命令行执行的控制台程序相比,Windows程序具有不同的结构,而且更复杂.
首先,在控制台程序中可以直接获取键盘的输入,并将输出直接写到命令行.
但Windows程序只能利用Windows操作系统提供的函数来访问计算机的输入和输出设备,直接访问硬件资源是不允许的.
因为在Windows下面可能会同时运行多个程序,所以Windows系统必须确定输入是针对哪个应用程序的,然后相应地通知有关的程序.
也就是说,Windows操作系统控制了用户与应用程序之间的通信.
图1-16列出了Windows程序与Windows操作系统,以及输入输出设备之间的交互关系.
Windows程序是其于消息驱动的,用户在Windows操作系统进行的所有操作都会被系统转化为消息,然后放置到Windows应用程序的消息队列中,最后由应用程序从消息队列中获取消息进行响应.
箭头3表示Windows应用程序可以通知操作系统执行某个具体的动作,例如,通知操作系统在显示器上显示一行文本.
从Windows应用程序的基本工作机制可以看出,即使是最基本的Windows程序也需要包含若干行代码,以便于操作系统进行交互.
在使用VisualC++2008开发Windows程序时,应用程序向导会根据用户的设置生成一个基本的Windows程序.
图1-16Windows应用程序工作原理与控制台程序一样,VisualC++2008也可以创建两种不同的Windows应用程序:使用MFC的本地C++应用程序和在CLR中运行的WindowsForms应用程序.
1.
5.
1创建MFC应用程序创建MFC应用程序的操作步骤如下.
(1)要创建Windows程序可以选择"文件"|"新建"|"项目"菜单,或直接按Ctrl+Shift+N组合键,然后在"新建项目"对话框中选择项目类型为MFC,并选择"MFC应用程序"作为该项目的模板,如图1-17所示.
图1-17MFC应用程序(2)单击"确定"按钮后,会显示"MFC应用程序向导"对话框.
在该对话框中包含许多选项,它们决定应用程序将包括哪些功能.
如图1-18所示,该对话框右侧列表中的条目标识了这些选项.
(3)在后面的示例中将要使用其中的许多选项.
在本章忽略所有选项,接受默认设置即可.
单击"完成"按钮,使用默认设置创建项目.
(4)编译和执行MFC应用程序完全与控制台应用程序相同,直接按Ctrl+F5组合键就能编译并执行项目.
运行的MFC应用程序如图1-19所示.
图1-18MFC应用程序向导图1-19MFC应用程序运行效果从图1-19可以看出,该窗口包括了菜单、工具栏和状态栏.
尽管没有编写一行代码,MFC应用程序向导已经帮用户创建了一个功能相当不错的Windows程序.
接下来,开发人员只需要根据自己的需要向项目中添加适当的代码,就可以建立自己想要的Windows应用程序.
1.
5.
2创建WindowsForms应用程序创建WindowsForms应用程序的步骤如下.
(1)WindowsForms应用程序是基于CLR的托管程序,因此应该在"新建项目"对话框左侧窗口中选项项目类型为CLR,在右侧窗口选择使用的模板为"Windows窗体应用程序",如图1-20所示.
图1-20Windows窗体应用程序(2)单击"确定"按钮,创建项目后,应该会看一个空白的Windows窗体,它没有包含菜单、工具栏和状态栏.
当然,用户很容易添加这些,但Windows窗体应用程序向导并没有为用户做这些工作.
在主窗口显示是的应用程序窗口的图像,而不是代码.
因为WindowsForms程序主要是用图形设计方法,而不是编码方法.
可以通过在图上拖、放GUI组件,将其添加到应用程序窗口中.
VisualC++2008自动生成显示这些组件的代码.
(3)按Ctrl+Alt+X组合键或者选择"视图"|"工具箱"菜单,更简单的方法是将鼠标移向主窗口的右侧的"工具箱"标签,这时会看到一个新窗口,其中显示了可以添加到窗体上的GUI组件列表,如图1-21所示.
图1-21工具箱现在可以试着将几个按钮添加到窗口中.
单击"工具箱"窗口列表中的Button,然后在主窗口中显示的窗体的某个位置单击,就可以在哪个位置添加按钮.
可以通过拖动按钮的边界来调整其大小,还可以通过四处拖动来重新定位.
(4)按Ctrl+F5组合键编译并执行这个示例,将显示一个简单的窗体,其中包含了一个按钮.
这个窗体与用户在主窗口设置的窗体完全一样,这就是所谓的可视化设计.
官方网站:点击访问白丝云官网活动方案:一、KVM虚拟化套餐A1核心 512MB内存 10G SSD硬盘 800G流量 2560Mbps带宽159.99一年 26一月套餐B1核心 512MB内存 10G SSD硬盘 2000G流量 2560Mbps带宽299.99一年 52一月套餐...
关于HostDare服务商在之前的文章中有介绍过几次,算是比较老牌的服务商,但是商家背景财力不是特别雄厚,算是比较小众的个人服务商。目前主流提供CKVM和QKVM套餐。前者是电信CN2 GIA,不过库存储备也不是很足,这不九月份发布新的补货库存活动,有提供九折优惠CN2 GIA,以及六五折优惠QKVM普通线路方案。这次活动截止到9月30日,不清楚商家这次库存补货多少。比如 QKVM基础的五个方案都...
vpsdime怎么样?vpsdime是2013年成立的国外VPS主机商,以大内存闻名业界,主营基于OpenVZ和KVM虚拟化的Linux套餐,大内存、10Gbps大带宽、大硬盘,有美国西雅图、达拉斯、新泽西、英国、荷兰机房可选。在上个月搞了一款达拉斯Linux系统VPS促销,详情查看:vpsdime夏日促销活动,美国达拉斯vps,2G内存/2核/20gSSD/1T流量,$20/年,此次推出一款Wi...