ImageVerifierCode 换一换
格式:PPT , 页数:135 ,大小:819.50KB ,
资源ID:14330510      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/14330510.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Windows应用程序的基本结构PPT资料.ppt)为本站会员(b****1)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Windows应用程序的基本结构PPT资料.ppt

1、它是一个类的集合,通过覆盖WinAPI,为编程提供了一个面向对象的界面。它使windows程序员能够利用C+面象对象的特性进行编程,类似BCB的OWL,Delphi的VCL组件。它把那些进行SDK编程时最繁琐的部分提供给程序员,使之专注于功能的实现。你不妨把它想象成类似TC提供的函数库吧。,SDK编程,利用Windows API函数编写Windows应用程序必须首先了解以下内容:(1)窗口的概念(2)事件驱动的概念(3)句柄(4)消息,Windows的事件驱动机制,Dos的过程驱动与Windows的事件驱动 在讲Window消息循环之前,我想先谈一下Dos与Windows驱动机制的区别:DOS

2、程序主要使用顺序的,过程驱动的程序设计方法。顺序的,过程驱动的程序有一个明显的开始,明显的过程及一个明显的结束,因此程序能直接控制程序事件或过程的顺序。而Windows的驱动方式是事件驱动,就是不由事件的顺序来控制,而是由事件的发生来控制,所有的事件是无序的,作为一个windows程序员,在你编写程序时,你并不知道用户先按哪个按纽,也不知道程序先触发哪个消息。你的任务就是对正在开发的应用程序要发出或要接收的消息进行排序和管理。,过程驱动方法和事件驱动方法,Dos编程和Windows编程不同,dos下的C编程的main()一样,windows下的入口是WinMain()函数。WinMain()所

3、起的作用:初始化,展示窗口,销毁应用程序等。第一个参数:应用程序的当前实例句柄。第二个参数:应用程序的前一个实例句柄,别管它,对于Win32位而言,它一般是NULL.第三个参数:指向任何传给程序的命令行参数。PSTR代表指向字符串的指针。第四个参数:它告诉应用程序如何初始化窗口,如最大化,最小化等状态。,WinMain函数的功能,三个基本的组成部分:函数说明、初始化和消息循环,WinMain函数,注意!Win是多任务管理的,同一应用程序的多个窗口可能会同时存,Win系统对每个窗口的执行称为一个实例,并用一个实例句柄来唯一标识,Windows常见的数据类型,在Windows.h中定义了Windo

4、ws 应用程序中包含种类繁多的数据类型,重要的数据结构,两者句柄定义的不同,句柄(handle):在标准C库中句柄用来对文件输入输出。在Windows环境中,句柄是用来标识项目的,这些项目包括:*.模块(module)*.任务(task)*.实例(instance)*.文件(file)*.内存块(block of memory)*.菜单(menu)*.控制(control)*.字体(font)*.资源(resource),包括图标(icon),光标(cursor),字符串(string)*.GDI对象(GDI object),包括位图(bitmap),画刷(brush),元文件(metafil

5、e),调色板(palette),画笔(pen),区域(region),以及设备描述表(device context)。WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的,相反的,WINDOWS API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。,句柄是什么?,在Win32里,句柄是指向一个无值型对象(void*)的指针,是一个4字节长的数据”。句柄并不是一个真正意义上的指针。从结构上看,句柄的确是一个指针,尽管它没有指向用于存储某个对象的内存位置,而实际上句柄指向的是一个包含了对该对象进行的引用的位置。我们天气热摇扇子的时候只要抓住扇

6、柄便可以控制整个扇子的运动了,在程序中也差不多是这个意思。通常一个句柄就可以传递我们所要做的事情。有经验的开发者肯定清楚,编写程序总是要和各种句柄打交道的,句柄是系统用来标识不同对象类型的工具,如窗口、菜单等,这些东西在系统中被视为不同类型的对象,用不同的句柄将他们区分开来。,句柄,常用句柄类型及其说明,应用程序通过句柄访问相应的对象信息,HWND窗口句柄HDC设备环境句柄HBITMAP位图句柄HCURSOR光标句柄HICON图标句柄HFONT字体句柄HMENU菜单句柄HPEN画笔句柄HFILE文件句柄HBRUSH画刷句柄HINSTANCE当前实例句柄,Windows程序的特点,窗口句柄:系统

7、通过窗口句柄来在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。所有的命名采用了匈牙利表示法。如消息的前缀使用msg.句柄使用h.函数使用fn等。Windows程序则至少两个主程序,一个是WinMain(),int WINAPI WinMain(HINSTANCE hInstance,/handle to current instanceHINSTANCE hPrevInstance,/handle to previous instance LPSTR lpCmdLine,/command

8、line int nCmdShow/show state);,Windows程序的特点,另一个是窗口过程函数WndProc,它的函数原型为:long FAR PASCAL WndProc(HWND hWnd,WORD message,WORD wParam,LONG lParam);窗口函数与回调函数:在Windows中,应用程序通过要求Windows完成指定操作,而承担这项通信任务的API函数就是Windows的相应窗口函数WndProc。应用程序不直接调用任何窗口函数,而是等待Windows调用窗口函数,请求完成任务或返回信息。为保证Windows调用这个窗口函数,这个函数必须先向Wind

9、ows登记,然后在Windows实施相应操作时回调,所以窗口函数又称为回调函数。WndProc是一个主回调函数,Windows至少有一个回调函数。典型的回调函数有窗口过程、对话框过程和钩子函数。实际上,也许有不止一个的窗口过程。例如,每一个不同的窗口类都有一个与之相对应的窗口过程。实例:在Windows中,能多次同时运行同一个应用程序,即运行多个副本,每个副本叫做一个“实例”。,Windows程序的特点,WinMain()函数的调用约定是PASCAL。在这里PASCAL是一个调用约定,由于这种方式最早由PASCAL采用,所以这么叫。在MSDN中的C+Language Reference中,Ca

10、lling Conventions这一章都是讲调用约定的。约定:微软重定义了许多约定类型,为的是可以让代码更容易跨平台或者跨编译器。其实,调用约定要解决两个问题,都是针对堆栈操作:1。参数传递的顺序(本质是压栈的顺序)2。谁负责平栈(调用者还是调用对象)一个函数的声明、定义和实现中的调用方式一般都一致。WINAPI标识符的定义是:#define WINAPI _stdcall,_stdcall指Window调用函数的一种方式,也就是如何在堆中存取函数参数的方式。许多Windows Api函数调用声明为_stdcall方式。,调用方式,1、_stdcall是Pascal程序的缺省调用方式,通常用

11、于Win32 Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈。VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上“”和参数的字节数(堆栈要求分配的字节数)。如:_TestMethod4 2、C调用约定(即用_cdecl关键字说明)按从右至左的顺序压参数入栈,由调用者把参数弹出栈。另外,在函数名修饰约定方面也有所不同。_cdecl是C和C程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。VC将函数编译后会在函数名前面加上下划线前缀。是MFC缺省调用约定。_TestMethod,调

12、用方式,CALLBACK和WINAPI函数是由你设计的函数,但你不能“显式”的调用它,而是Windows系统自己调用,例如窗口过程函数,枚举函数等,这是由Windows系统的工作机制决定的。至于这些函数为什么要是CALLBACK,且看下面详解:CALLBACK,WINAPI等在windef.h中被如下定义:#define CALLBACK _stdcall#define WINAPI _stdcall#define WINAPIV _cdecl#define APIENTRY WINAPI#define APIPRIVATE _stdcall#define PASCAL _stdcall,调用

13、方式举例,CALLBACK就是要VC编译器在编译时采取非默认(_cdecl)的方式(_stdcall),_stdcall和_cdecl最大的不同就是我前面说的“堆栈指针恢复的责任归属”-C编译器默认(_cdecl)是主函数来恢复stack指针SP,若指定关键字_stdcall,则编译器生成的码是由被调函数自己恢复SP,看看下面的例子:假如有一个函数声明如int _stdcall getMax(int a,int b);返回两者中较大值。在主函数中被调用,调用时VC造出的码如下:(其它编译器可能不同)0040102B push 38h;参数b0040102D push 60h;a0040102F

14、 call ILT+15(_getMax)(0 x0040100f);call getMax().为 getMax()造出的汇编语句是00401020 push ebp00401021 mov ebp,esp.;其它指令00401026 pop ebp00401027 ret 8;在返回时修改堆栈指针,调用方式举例,若声明及定义时无 _stdcal,VC造出的码如下:0040102B push 38h 0040102D push 60h 0040102F call ILT+15(_getMax)(0 x0040100f)00401034 add esp,8;esp由主函数恢复.为 getMax()造出的汇编语句是00401020 push ebp00401021 mov ebp,esp.;其它指令00401026 pop ebp00401027 ret;返回现在你该知CALLBACK 与不加CALLBACK 的函数在调用以及返回上有什么区别了吧。,Windows程序的特点,用位的“或”

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1