第4章Windows程序设计的基本概念.ppt_第1页
第4章Windows程序设计的基本概念.ppt_第2页
第4章Windows程序设计的基本概念.ppt_第3页
第4章Windows程序设计的基本概念.ppt_第4页
第4章Windows程序设计的基本概念.ppt_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第4章 Windows程序设计的基本概念,教学要点 本章内容主要包括Windows应用程序的特点,VC两种编程模式都要用到的基本概念及利用API编写简单的Windows程序的方法与步骤。 要求了解回调函数和图形设备接口概念、VC程序的命名规则和消息驱动机制,掌握窗口、实例、句柄、资源的概念,熟悉Windows图形用户界面中的元素,熟练掌握掌握建立Win32应用程序的步骤和WinMain()函数形参的含义。,4.1 Win 32编程特点 4.2 Windows程序用到的基本术语 4.3 开发Windows程序基本步骤 习题,4.1.1Windows运行机制消息驱动 4.1.2应用程序与Windo

2、ws操作系统紧密相连 4.1.3图形界面 4.1.4 Windows基本数据类型 4.1.5 VC程序中的命名规则,4.1Win 32编程特点,消息驱动,在别的程序设计语言中又叫事件驱动。在执行过程中,如果用户需要输入什么参数或用户需要作出选择,程序将等待用户的输入。只有用户提供了足够的数据程序才能继续进行下去,否则它将一直等待下去,应用程序不会自己选择其它的途径或完成其它的功能,用户也不能干预程序的运行过程。 在消息驱动的程序结构中,程序控制流程是由实际运行时各种事件的实际发生来触发,而事件的发生可能是随机的、不确定的,并没有预先的顺序。消息驱动是一种面向用户的程序设计方法,在程序设计过程中

3、除了完成所需要的程序功能之外,更多的是要考虑用户可能的各种输入消息,并有针对性地设计相应的处理程序。消息驱动程序设计还是一种被动式的程序设计方法,程序开始运行时,处于等待消息状态,当取得消息后就对其作出相应反应,处理完毕后又返回等待消息的状态。消息驱动的程序就是一个不断产生消息和处理消息的过程是一个更加模块化、更加独立的程序。,4.1.1 Windows运行机制消息驱动,4.1.2 应用程序与Windows操作系统紧密相连,利用VC进行Windows应用程序开发的一个显著特点就是,应用程序与操作系统的联系非常密切。对操作系统比较熟悉的人编制程序相对来说就轻松一些,反之,学会利用VC进行Wind

4、ows应用程序开发的人,往往会对操作系统有一个清晰的认识。设计C语言的目的就是进行操作系统的开发,C+的发明者Bijarne Stroustrup就是进行操作系统研究的一个学者。在Windows环境下开发程序时,绝对不能忽视操作系统所起的作用,因为我们时时刻刻在与操作系统打交道。 最明显和操作系统打交道的例子就是消息传递。消息与事件紧密相连,事件是源,消息是果,消息是一个事件的代表,程序运行过程中的任何一个事件都产生一个消息,比如按了键盘的某个键就会产生键盘的消息。,Windows程序设计是消息驱动的,消息传递是它的核心,而消息管理是由 Windows完成的,应用程序要获得消息就要从操作系统中

5、获得。应用程序有两种获得消息的方式: 回调函数一经设计好,就成了Windows系统的扩展,就会在发生别的事件时,由操作系统自动调用该回调函数。在应用程序的任何地方找不到明显调用该函数的地方,用DOS编程观点来看,似乎此函数并没有用到,事实上回调函数不仅用到了,而且起了很大作用,正是通过它,应用程序才获得了消息,才知道当前发生了什么事件,才根据不同的事件采取不同的处理措施。,4.1.2 应用程序与Windows操作系统紧密相连(续),1.应用程序调用Windows提供的获取消息函数,如GetMessage(); 2.由Windows调用程序员提供的一种特殊函数回调函数。,4.1.3图形界面,Wi

6、ndows支持丰富的图形用户界面对象,包括窗口、图标、对话框等。 1窗口窗口是Windows图形界面中最重要的部分,是屏幕上与一个应用程序相对应的矩形区域,关闭了一个窗口后,相应的应用程序就被关闭。图4.1是一个典型的窗口外观。 2客户区 客户区是窗口中最大的一块空白矩形区域,它是用户与系统进行交互的主要区域,一般用于显示应用程序的输出。 3标题栏 标题栏位于窗口顶部,其中显示的文本一般用于标注应用程序的名称。标题栏的颜色反映该窗口是否是一个活动窗口。标题栏是属于非客户区域。,4菜单栏 菜单栏用户最熟悉,它位于标题栏的下方,横跨窗口,上面列出了应用程序支持的大部分功能。 5图标 一个用于提醒用

7、户的小小图像,它代表一个应用程序。当一个应用程序最小化时,就呈现为一个图标。 6光标 Windows光标是显示在屏幕上的一个位图 ,用于响应鼠标或其它定位设备的操作。在应用程序中,常常通过改变光标形状来指出程序的操作状态。 7工具栏 工具栏位于菜单栏下方,上面的位图按钮代表最常用的命令。让鼠标在某个按钮停一会,就会在按钮下方出现一个黄色的小窗口,里面显示该按钮的简单提示信息。,4.1.3 图形界面(续),8状态栏 状态栏位于窗口底端,用于输出菜单的详细说明和其它一些提示信息。 9对话框 对话框是一种特殊窗口,主要用于接收用户输入和输出。图4.1显示了一个Word中的“查找与替换”对话框。一般在

8、选择菜单名称后面带有省略号()的菜单项时会弹出一个对话框。 10控件 对话框中包含的许多小窗口都是控件。如“查找与替换”对话框上的“查找内容(N)后就是一个编辑框控件,“取消”操作就是一个按钮控件。,4.1.3 图形界面(续),图4.1 窗口外观,4.1.4 Windows基本数据类型,在标准的C/C+语言中,int、char、float、double都是常见的数据类型,而在32位Windows的C/C+开发平台中,为了满足数据定义需要,又添加了一系列新的数据类型。表4.1列出了较为常见的数据类型,大体包括了字符型、整型、浮点型、布尔型、指针型以及Windows应用程序所特有的句柄型,表示指针

9、型的数据类型往往以P或LP作为前缀,而句柄型则总是冠以H。 在Windows应用程序中,不可避免地要使用各种各样的句柄。简单地说,它是用来标识诸如菜单、图标、窗口、内存块、输出设备等信息的,通过它可以访问各种资源。句柄并非对象所在的地址指针,它是作为系统内部表的索引值来使用的。譬如说,一个窗口打开之后,对应内存中的一个内存块,这个窗口所在的内存块地址往往会由操作系统作动态调整,但其句柄却不会随之变化,我们不必关心其地址的变化,而是简单地通过作为窗口标识的句柄来访问这个窗口。如果该应用程序有几个副本在同时运行,那么每个这种窗口都会有一个各不相同的句柄。除了前面介绍的基本数据类型外,前面章节中所介

10、绍的MFC中的CString、CTime、CPoint、CSize、CRect等都是经常用到的数据类型。,表4.1 基本数据类型,表4.1基本数据类型(续),表4.1基本数据类型(续),*4.1.5 VC程序中的命名规则,1匈牙利命名规则 匈牙利命名法成为大家一致使用的变量名约定,是事实上的标准,它的名字来源于它的匈牙利籍开发者,Microsoft程序员Charles Simonyi。匈牙利命名规则建议变量名称以一个或多个小写字母开头,这些小写字母用以标识其变量类型,类型标识字母的下一个字母一般采用大写。类型定义使用相同的类型标识符作为前缀,唯一不同的是,类型定义名称一般全部使用大写。 例如,

11、变量iNum自身名称就说明它为整型,变量hWnd说明其为指向应用程序窗口的句柄,变量lpszString表示它是一个指向以NULL结束的字符串的长指针。表4.2列出了一般的匈牙利命名原则。,表4.2 匈牙利命名规则约定,2.其它前缀约定 除了匈牙利命名规则使用的前缀外,Windows Application FrameWorks(AFX)和MFC对象类使用的其它一些前缀在表4.3中列出。 在这组前缀中,只有两个C类前缀和m_成员变量可能在自己写的程序代码中出现,其余前缀主要用于MFC/Windows库中。 3. AFX和AppWizard前缀。 VC AppWizard和ClassWizard

12、不但能生成大量有用代码帮助你链接已有代码和对话框资源元素,而且还能产生使用标准符号前缀的标识符。表4.4应用程序框架符号前缀,*4.1.5 VC程序中的命名规则(续),表4.3 AFX和MFC前缀,表4.4 应用程序框架符号前缀,4.2Windows程序用到的基本术语,4.2.1 窗口 4.2.2 实例 4.2.3 句柄 4.2.4 资源 4.2.5 窗口函数 4.2.6 图形设备接口 4.2.7 回调函数,4.2.1 窗 口,从表面理解,窗口无非是一个矩形区域。从程序运行的内存组织角度看,窗口对应的是一个数据结构WNDCLASS,从用户的角度看,窗口是用户输入输出数据的一个接口,通过它,Wi

13、ndows应用程序才能取得外部的数据并把处理后的数据显示在屏幕矩形区域中。从程序的内部处理过程看,每一个窗口对应着一个应用程序的消息处理队列,应用程序主要通过窗口函数来对用户的输入进行处理。 可见窗口是Windows应用程序基本操作单元,是应用程序与用户之间交互的接口环境,也是系统管理应用程序的基本单位。编写一个Windows的应用程序首先应创建一个或多个窗口,随后应用程序的运行过程即是窗口内部、窗口和窗口之间、窗口和系统之间进行数据处理和数据交换的过程。作为一个Windows程序设计人员,我们首先要搞清Windows这个数据结构。,4.2.2 实例,一个实例代表一个可执行程序在内存中的拷贝。

14、在Windows系统中,可执行程序的每次运行都代表完全独立的进程,各个进程都有自己的虚拟地址空间。若一个应用程序执行许多次,在内存中就有多个程序的拷贝,也可以说是一个应用程序在内存中有多个实例。 应用程序的实例句柄对于管理整个应用程序的资源很重要,因此我们常常在Windows程序的入口WinMain()处将实例句柄保存在全局变量中。,4.2.3句柄,句柄这个概念在Windows的程序设计中常常碰到。Windows对绝大多数对象的引用都是通过句柄来进行的。 在Windows环境中,句柄可以用来标识模块、任务、实例、文件、内存块、菜单、控件、字体、资源、,包括图标、光标、字符串、GDI对象,包括位

15、图)、画刷、元文件、调色板、画笔、区域以及设备描述表。Windows程序并不是用物理地址来标识一个内存块、文件、任务或动态装入模块的,相反,Windows API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。 句柄是内部表格的索引值,Windows通过句柄到内部表格中去存取相关信息。因此应用程序只能处理到句柄的层次,并不能直接获取表格中的数据。表4.5是常见的句柄类型及其含义。,表4.5 常见的句柄类型及其含义,4.2.4 资源,一个Windows程序,往往有菜单、工具条、对话框、位图、图标、加速键、字符串等,这些元素都被称为资源。应用程序不仅可以使用操作系统所提供

16、的资源,而且可以在VC开发环境中利用相应的资源编辑器建立自己的资源。应用程序的资源被定义在.RC文件中,资源可以预先编辑、独立编译,最后与可执行模块链接在一起,形成可独立执行的.EXE文件或动态链接库文件.DLL。当应用程序需要这些资源时,可以利用Windows的API函数将这些资源调入。 可见,Windows应用程序的资源是自己携带的,这要比将资源作为外部文件方便的多。由于资源与程序代码是分离的,“招之即来,挥之即去”,当使用时才调入内存,这减少了程序运行时对内存的消耗量。,4.2.5 窗口函数,由于窗口是应用程序与用户交互的接口,当窗口接受到输入时,必定交给某个函数加以处理,这个负责处理消

17、息的函数就是窗口函数,它决定了当一个消息被接收时所采取的动作。窗口函数是一个对每一个消息利用switch语句进行处理的函数,它是Windows消息驱动机制的发动机。下一节以一个具体的实例来详细解释。,4.2.6 图形设备接口,Windows应用程序的全部输出(包括显示和打印)都必须通过图形设备接口(Graphic Device Interface,简称GDI)中的函数来完成,GDI是Windows系统重要组成部分,负责系统与用户或绘图程序之间的信息交换,并控制在输出设备上显示图形或文字。其最大作用就是将程序员与具体的物理设备相隔离,使得程序员没有必要考虑具体设备的操作细节(如显示缓存的地址、打

18、印机的端口等),无论是使用显示还是打印,使用的都是同一个API函数。 通俗的来说,我们可以把GDI看作一个大的绘图工具箱,所有在窗口上所绘制的东西,都必须使用工具箱中的东西,即GDI中函数。学习GDI,关键是要搞清楚这些函数的分类及其用法。,4.2.7回调函数,回调函数,顾名思义,就是写好了等着别人来调用的函数。这些函数的原型都是由调用者自己定义好的,使用的时候,只要按照原型定义一个函数,然后将函数指针传递过去就行了。它们只能通过Windows操作系统来调用,这些函数我们可以根据自己的需要设计,但不能直接调用它们。 回调函数必须严格地按Windows系统的规定进行说明和定义。前面所所的“窗口函

19、数”就是一个典型的回调函数,当注册窗口类时,要将函数地址告诉Windows,Windows通过调用该窗口函数来让窗口处理消息。当发送消息给程序时,Windows调用此函数进行消息的处理。窗口函数调用约定、返回值以及参数都是固定的,程序员必须按其规定进行才能正常工作。,4.3开发Windows程序基本步骤,这节以一个简单的Windows应用程序为例来讲解编写Windows程序的基本步骤,除了了解创建的步骤外,还要熟悉每个步骤所操作的对象与应用程序的关系。 【例4-1】调用API函数MessageBox()实现一个简单的Windows程序。,4.3.1建立一个Win32工程 4.3.2建立头文件

20、4.3.3建立Win32 Application实现文件 4.3.4分析Win32应用程序 *4.3.5建立资源文件 *4.3.6VC编程流程及各组件作用 *4.3.7VC项目中的文件类型,4.3.1建立一个Win32工程,在Windows环境下,一个应用程序的组织是以工程为单位来进行的,这与利用TC来开发DOS下的应用程序大不相同。在TC下,一个应用程序主要包含一个.C文件,而用VC开发应用程序时,一个应用程序包括各种各样的文件(通过文件扩展名来标识,具体信息见 4.3.6节)。 工程文件是整个应用程序的总调度中心,负责调度构建Windows程序的各个职能部门(各类文件),因此开发一个应用程

21、序,首先要利用应用程序向导AppWizard创建一个工程程序。利用向导所创建的一个工程程序,实质上是一个应用程序的框架。下面给出在VC环境下创建工程的方法,并阐述VC可以创建的工程类型。 1启动Visual C+的集成开发环境Developer Studio。 2选择菜单命令“File|New|Projects”。该选项卡下给出了VC可以创建的工程类型,下面把本书要利用的和常用的工程类型做一简介(见下页),其它的自己琢磨。,3选择应用程序类型“Win32 Application”,表示要创建一个利用API编写的Windows应用程序的工程项目。在Project Name编辑框中输入该工程的名称

22、“FirstApiProg”,Location为工程所在的目录,如果不存在,系统会自动创建。完后,单击“OK”按钮。 4在Win32 Application-step 1 of 1对话框中,选择“An empty project”,表示创建一个空的工程文件,程序代码由程序员随后输入。最后单击“finish”按钮,系统会弹出一个总结信息对话框,单击“OK”按钮关闭它。,4.3.1建立一个Win32工程(续),(1)ATL COM AppWizard ATL是Active Template Library的缩写。使用Active Template Library可以创建包含小型ActiveX控件的

23、ATL工程.该类型工程主要是创建COM组件,本书的第三篇就是利用它来讲解COM组件的制作。 (2)MFC ActiveX Control Wizard 创建ActiveX控件,即开发人员编写的可用于VC对话框、Visual Basic窗体或Web网页的控件。ActiveX控件是一种插件,可以插在别的应用程序中,它实现了一种二进制代码的软件复用。 (3)MFC Appwizard(dll) 基于MFC的DLL工程。要在DLL中集成大量使用MFC类的功能,则可以选择它。本书的第三篇创建动态链接库就是利用它来实现的。,4.3.1 建立一个Win32工程(续),(4)MFC AppWizard(exe

24、) 基于MFC类库的Windows可执行应用程序。这是使用率最高的向导。本篇就是讲解利用该向导创建基于MFC 应用程序。 (5)Win32 Applization Win32应用程序。如果要在VC中创建使用API,而不使用MFC的应用程序,则选择该类型。 (6)Win32 Console Application Win32控制台应用程序,适合编写基于字符方式的应用程序。本书的第一篇就是利用它创建的应用程序来讲解面向对象的理论和传统的C+应用程序。 (7)Win32 Static Library Win32 静态链接库。静态链接库是包含对象和函数及数据的文件。,4.3.1 建立一个Win32工程

25、(续),4.3.2建立头文件,当利用AppWizard创建好一个工程后,也就创建了一个应用程序架构。对于满足特定用户需要的应用程序,我们还必须在其中添加一些东西。因此就必须利用VC工具去添加。如果把上节创建的工程比做一个人的骨架话,下面几节创建的文件就类似与人的血肉。下面讲如何创建头文件这块血肉,并阐明该血肉的功能。 1打开Visual C+的集成开发环境Developer Studio。 2择菜单命令“File|New|Files”。该选项下给出了VC可以创建的各种文件的类型。由于我们要创建头文件,因此我们选择“C/C+ Header File”。并在File编辑框里输入头文件的名称。一般所

26、创建的头文件要添加到当前的工程中,因而要把“Add To Project”选择框选中。 头文件的作用是:一般在头文件存放所建立的类、函数、变量的声明,其相应的实现文件要放到对应的实现文件.cpp中。由于我们第一个API程序比较简单,没有用到自定义类或函数,因此,在该工程中并没有添加头文件.h。该步骤对该工程无效。,4.3.3 建立Win32 Application实现文件,头文件一般存放在.h文件中,其相应的实现文件要放到对应的实现文件.cpp中。下面是在工程中添加实现文件的步骤: 1启动Visual C+的集成开发环境Developer Studio。 2选择菜单命令“File|New|Fi

27、les”。选择“C/C+ Source File”,并在File编辑框里输入实现文件的名称“FirstApiProg”。一般所创建的实现文件要添加到当前的工程中,因而要把“Add To Project”选择框选中。 3单击“OK”按钮,VC自动进入到文件FirstApiProg.cpp编辑的编辑状态,在其中输入如下的代码:,#include windows.h“ APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow) MessageBox(NULL,API是开发Wi

28、ndows应用程序的最直接的模式!, First API Program,MB_OK); return 0; ,4运行程序 选择“Build|Build FirstApiProg.exe”菜单项创建可执行文件,然后选择“Build|Execute FirstApiProg.exe”菜单项执行刚才创建的可执行文件FirstApiProg.exe,程序运行结果如图4.2所示。,4.3.3 建立Win32 Application 实现文件(续),4.3.4 分析Win32应用程序,1windows应用程序的头文件 在FirstApiProg.cpp文件的开头有一个重要的头文件windows.h,该文

29、件是所有Windows应用程序运行必须的一个头文件。该头文件中包含了许多其它头文件,在Windows下搜索出该文件,打开并观察其内容,可以看出在其中包含的的比较重要的头文件如下: #include /用于定义基本数据类型 #include #include #include 在这些头文件中定义了windows所支持的基本数据类型、数据结构、常用的标识符和操作系统所提供的所有API函数原型声明。,4.3.4 分析Win32应用程序(续),2Windows应用程序的入口点 在第一篇的控制台应用程序中,程序的入口点总是main()函数,如需要编写具有图形用户界面的Windows应用程序,则程序的入口

30、点变成了WinMain()。 (1)WinMain()的函数原型 WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ); 由于Windows应用程序可能并行地执行多次,因而可能出现同一个应用程序的多个窗口同时存在的情况,Windows系统将应用程序每一次执行称为该应用程序的一个实例,并使用一个实例句柄来标识它。,在WinMain()函数中,hInstance是当前应用程序的实例句柄。参数lpCmdLine是指程序运行时的命令行参数,整型参数nCmdShow规定了窗

31、口如何显示,当它的值为SW_SHOWNORMAL时代表正常显示,值为SW_MINIMIZE代表最小化显示,值为SW_MAXIMIZE时代表最大化显示等。 WinMain()函数返回值是一个整数,在windef.h中有定义: #define WINAPI _stdcall 除了_stdcall调用方式外,还有_cdecl和_pascal调用方式,其区别在表4.6中表示。,4.3.4分析Win32应用程序(续),3 MessageBox函数 MessageBox是一个Woindows API函数,它通过弹出一个消息对话框来显示一些简短的信息。如报告任务的完成、报告一条严重的错误等。该函数的原型为: int MessageBox( HWND hWnd, / 所属窗口的句柄 LPCTSTR lpText, / 需要显示的提示信息 LPCTSTR lpCaption, / 对话框窗口的标题字符串 UINT uType / 消息对话框的按钮和图标类型 );该函数的第四个参数可以指定对

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论