Windows应用程序的基本结构.ppt
- 文档编号:1414312
- 上传时间:2022-10-22
- 格式:PPT
- 页数:135
- 大小:819.50KB
Windows应用程序的基本结构.ppt
《Windows应用程序的基本结构.ppt》由会员分享,可在线阅读,更多相关《Windows应用程序的基本结构.ppt(135页珍藏版)》请在冰豆网上搜索。
Windows应用程序框架结构,哈尔滨工程大学,概述,理解Window编程所使用的事件驱动模型Window编程的基本框架,Windows平台下可视化开发工具,可视化开发系统集成了一系列系统可用资源和开发工具1、程序调试工具包括源程序语法检查、可执行程序修改和运行监视等2、源程序编辑器和编译器3、资源管理器,包括图形化窗口及组成元素的多种对象的编辑器4、系统函数库和系统函数开发工具5、可选择并构成具体语句或源程序结构的例程库及Help,Windows程序的特点,大致说来windows编程有两种方法:
a.windowsc方式(SDK),SDK编程就是直接调用windows的API进行编程;b.c+方式:
即对SDK函数进行包装,如VC的MFC,BCB的OWL等。
MFC把这些API封闭起来,共有一百多个类组成.API,全称applicationprograminterface,意思是应用程序编程接口(说起API并不仅仅指windows而言,windows支持的API叫winapi)。
winapi就是应用程序和windows之间通讯的一个编程界面。
windows提供了上千个API函数,以方便程序员来编写应用程序。
Windows程序的特点,WinSDK程序设计就是API方式的windows程序设计。
SDK,全称SoftwareDevelopersKit,意思是软件开发工具箱。
MFC,全称MicrosoftFoundationClasses,伪软把WinAPI进行封装的类库。
它是一个类的集合,通过覆盖WinAPI,为编程提供了一个面向对象的界面。
它使windows程序员能够利用C+面象对象的特性进行编程,类似BCB的OWL,Delphi的VCL组件。
它把那些进行SDK编程时最繁琐的部分提供给程序员,使之专注于功能的实现。
你不妨把它想象成类似TC提供的函数库吧。
SDK编程,利用WindowsAPI函数编写Windows应用程序必须首先了解以下内容:
(1)窗口的概念
(2)事件驱动的概念(3)句柄(4)消息,Windows的事件驱动机制,Dos的过程驱动与Windows的事件驱动在讲Window消息循环之前,我想先谈一下Dos与Windows驱动机制的区别:
DOS程序主要使用顺序的,过程驱动的程序设计方法。
顺序的,过程驱动的程序有一个明显的开始,明显的过程及一个明显的结束,因此程序能直接控制程序事件或过程的顺序。
而Windows的驱动方式是事件驱动,就是不由事件的顺序来控制,而是由事件的发生来控制,所有的事件是无序的,作为一个windows程序员,在你编写程序时,你并不知道用户先按哪个按纽,也不知道程序先触发哪个消息。
你的任务就是对正在开发的应用程序要发出或要接收的消息进行排序和管理。
过程驱动方法和事件驱动方法,Dos编程和Windows编程不同,dos下的C编程的main()一样,windows下的入口是WinMain()函数。
WinMain()所起的作用:
初始化,展示窗口,销毁应用程序等。
第一个参数:
应用程序的当前实例句柄。
第二个参数:
应用程序的前一个实例句柄,别管它,对于Win32位而言,它一般是NULL.第三个参数:
指向任何传给程序的命令行参数。
PSTR代表指向字符串的指针。
第四个参数:
它告诉应用程序如何初始化窗口,如最大化,最小化等状态。
WinMain函数的功能,三个基本的组成部分:
函数说明、初始化和消息循环,WinMain函数,注意!
Win是多任务管理的,同一应用程序的多个窗口可能会同时存,Win系统对每个窗口的执行称为一个实例,并用一个实例句柄来唯一标识,Windows常见的数据类型,在Windows.h中定义了Windows应用程序中包含种类繁多的数据类型,重要的数据结构,两者句柄定义的不同,句柄(handle):
在标准C库中句柄用来对文件输入输出。
在Windows环境中,句柄是用来标识项目的,这些项目包括:
*.模块(module)*.任务(task)*.实例(instance)*.文件(file)*.内存块(blockofmemory)*.菜单(menu)*.控制(control)*.字体(font)*.资源(resource),包括图标(icon),光标(cursor),字符串(string)*.GDI对象(GDIobject),包括位图(bitmap),画刷(brush),元文件(metafile),调色板(palette),画笔(pen),区域(region),以及设备描述表(devicecontext)。
WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的,相反的,WINDOWSAPI给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。
句柄是什么?
在Win32里,句柄是指向一个无值型对象(void*)的指针,是一个4字节长的数据”。
句柄并不是一个真正意义上的指针。
从结构上看,句柄的确是一个指针,尽管它没有指向用于存储某个对象的内存位置,而实际上句柄指向的是一个包含了对该对象进行的引用的位置。
我们天气热摇扇子的时候只要抓住扇柄便可以控制整个扇子的运动了,在程序中也差不多是这个意思。
通常一个句柄就可以传递我们所要做的事情。
有经验的开发者肯定清楚,编写程序总是要和各种句柄打交道的,句柄是系统用来标识不同对象类型的工具,如窗口、菜单等,这些东西在系统中被视为不同类型的对象,用不同的句柄将他们区分开来。
句柄,常用句柄类型及其说明,应用程序通过句柄访问相应的对象信息,HWND窗口句柄HDC设备环境句柄HBITMAP位图句柄HCURSOR光标句柄HICON图标句柄HFONT字体句柄HMENU菜单句柄HPEN画笔句柄HFILE文件句柄HBRUSH画刷句柄HINSTANCE当前实例句柄,Windows程序的特点,窗口句柄:
系统通过窗口句柄来在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。
而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。
所有的命名采用了匈牙利表示法。
如消息的前缀使用msg.句柄使用h.函数使用fn等。
Windows程序则至少两个主程序,一个是WinMain(),intWINAPIWinMain(HINSTANCEhInstance,/handletocurrentinstanceHINSTANCEhPrevInstance,/handletopreviousinstanceLPSTRlpCmdLine,/commandlineintnCmdShow/showstate);,Windows程序的特点,另一个是窗口过程函数WndProc,它的函数原型为:
longFARPASCALWndProc(HWNDhWnd,WORDmessage,WORDwParam,LONGlParam);窗口函数与回调函数:
在Windows中,应用程序通过要求Windows完成指定操作,而承担这项通信任务的API函数就是Windows的相应窗口函数WndProc。
应用程序不直接调用任何窗口函数,而是等待Windows调用窗口函数,请求完成任务或返回信息。
为保证Windows调用这个窗口函数,这个函数必须先向Windows登记,然后在Windows实施相应操作时回调,所以窗口函数又称为回调函数。
WndProc是一个主回调函数,Windows至少有一个回调函数。
典型的回调函数有窗口过程、对话框过程和钩子函数。
实际上,也许有不止一个的窗口过程。
例如,每一个不同的窗口类都有一个与之相对应的窗口过程。
实例:
在Windows中,能多次同时运行同一个应用程序,即运行多个副本,每个副本叫做一个“实例”。
Windows程序的特点,WinMain()函数的调用约定是PASCAL。
在这里PASCAL是一个调用约定,由于这种方式最早由PASCAL采用,所以这么叫。
在MSDN中的C+LanguageReference中,CallingConventions这一章都是讲调用约定的。
约定:
微软重定义了许多约定类型,为的是可以让代码更容易跨平台或者跨编译器。
其实,调用约定要解决两个问题,都是针对堆栈操作:
1。
参数传递的顺序(本质是压栈的顺序)2。
谁负责平栈(调用者还是调用对象)一个函数的声明、定义和实现中的调用方式一般都一致。
WINAPI标识符的定义是:
#defineWINAPI_stdcall,_stdcall指Window调用函数的一种方式,也就是如何在堆中存取函数参数的方式。
许多WindowsApi函数调用声明为_stdcall方式。
调用方式,1、_stdcall是Pascal程序的缺省调用方式,通常用于Win32Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈。
VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上“”和参数的字节数(堆栈要求分配的字节数)。
如:
_TestMethod42、C调用约定(即用_cdecl关键字说明)按从右至左的顺序压参数入栈,由调用者把参数弹出栈。
另外,在函数名修饰约定方面也有所不同。
_cdecl是C和C程序的缺省调用方式。
每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。
函数采用从右到左的压栈方式。
VC将函数编译后会在函数名前面加上下划线前缀。
是MFC缺省调用约定。
如:
_TestMethod,调用方式,CALLBACK和WINAPI函数是由你设计的函数,但你不能“显式”的调用它,而是Windows系统自己调用,例如窗口过程函数,枚举函数等,这是由Windows系统的工作机制决定的。
至于这些函数为什么要是CALLBACK,且看下面详解:
CALLBACK,WINAPI等在windef.h中被如下定义:
#defineCALLBACK_stdcall#defineWINAPI_stdcall#defineWINAPIV_cdecl#defineAPIENTRYWINAPI#defineAPIPRIVATE_stdcall#definePASCAL_stdcall,调用方式举例,CALLBACK就是要VC编译器在编译时采取非默认(_cdecl)的方式(_stdcall),_stdcall和_cdecl最大的不同就是我前面说的“堆栈指针恢复的责任归属”-C编译器默认(_cdecl)是主函数来恢复stack指针SP,若指定关键字_stdcall,则编译器生成的码是由被调函数自己恢复SP,看看下面的例子:
假如有一个函数声明如int_stdcallgetMax(inta,intb);返回两者中较大值。
在主函数中被调用,调用时VC造出的码如下:
(其它编译器可能不同)0040102Bpush38h;参数b0040102Dpush60h;a0040102FcallILT+15(_getMax)(0x0040100f);callgetMax().为getMax()造出的汇编语句是00401020pushebp00401021movebp,esp.;其它指令00401026popebp00401027ret8;在返回时修改堆栈指针,调用方式举例,若声明及定义时无_stdcal,VC造出的码如下:
0040102Bpush38h0040102Dpush60h0040102FcallILT+15(_getMax)(0x0040100f)00401034addesp,8;esp由主函数恢复.为getMax()造出的汇编语句是00401020pushebp00401021movebp,esp.;其它指令00401026popebp00401027ret;返回现在你该知CALLBACK与不加CALLBACK的函数在调用以及返回上有什么区别了吧。
Windows程序的特点,用位的“或”
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Windows 应用程序 基本 结构