Windows程序的内部运行原理

上传人:飞*** 文档编号:52327302 上传时间:2018-08-20 格式:PPT 页数:34 大小:299.50KB
返回 下载 相关 举报
Windows程序的内部运行原理_第1页
第1页 / 共34页
Windows程序的内部运行原理_第2页
第2页 / 共34页
Windows程序的内部运行原理_第3页
第3页 / 共34页
Windows程序的内部运行原理_第4页
第4页 / 共34页
Windows程序的内部运行原理_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《Windows程序的内部运行原理》由会员分享,可在线阅读,更多相关《Windows程序的内部运行原理(34页珍藏版)》请在金锄头文库上搜索。

1、Windows程序的内部运行原理Windows程序设计是完全不同于Dos环境下的程序设计,是一种事件驱动的程序设计方法。主要是基于消息的。当用户需要完成某种功能时,会调用OS的某种支持,OS将用户的需要包装成某种消息,并投递到消息队列当中。然后利用应用程序从消息队列中取走消息并进行响应。操作系统输入输出设备应用程序消息队列操作系统能 操纵输入输 出设备,以 执行特定的 功能操作系统能 感知输入输 出设备的状 态变化 应用程序可 以通知操作 系统执行某 个具体的动 作 操作系统能 够将输入设 备的变化上 传给应用程 序 在应用程序中要完成某个功能,都是以函数调用的形式实现的,同样,应用程序也是以

2、函数调用的方式来通知操作系统执行相应的功能的。操作系统所能完成的每一个特殊功能通常都有一个函数与其对应。也就是说,操作系统把它能完成的功能以函数的形式提供给应用程序使用,应用程序对这些函数的调用就叫做系统调用。这些函数的集合就是windows操作系统提供给应用程序的编程接口,即API。如CreateWindow就是一个API函数,应用程序中调用这个函数,操作系统就会按照该函数提供的参数信息产生一个相应的窗口。 应用程序如何通知操作系统 执行某个功能比如用户在某个程序活动时按下一个键,操作系统马上能够感知到这一事件,并且能知道用户按下的是哪个键,操作系统并不决定对这个事件如何做出反应,而是将这一

3、事件转交给应用程序,由应用程序决定如何对这一事件做出反应。好比有只蚊子叮了我们一口,我们的神经末梢(相当于操作系统)马上感知到这一事件,并传递给我们的大脑(相当于应用程序)。我们的大脑最终决定如何对这一事件做出反应,如将蚊子赶走,或是将蚊子拍死。对事件做出反应的过程就是消息响应。操作系统能够将输入设备的变化 上传给应用程序操作系统是怎样将感知到的事件传递给应用程序的呢? 这是通过消息机制(Message)来实现的。操作系统将每个事件都包装成一个称为消息的结构体MSG来传递给应用程序。typedef struct tagMSG HWND hwnd; UINT message;WPARAM wPa

4、ram;LPARAM lParam; DWORD time; POINT pt; MSG; 关于消息和消息队列窗口句柄消息的名字消息的附加参数窗口是屏幕上的一个矩形区域,应用程序在该区域中显示数据并等待鼠标点击。Windows应用程序的用户界面可以包含许多窗口,当然要对这些窗口进行标识。窗 口操作系统要管理和操作这些资源,都是通过句柄来找到对应的资源。按资源的类型,又可将句柄细分成 图标句柄(HICON)、光标句柄(HCURSOR),窗口句柄(HWND),应用程序实例句柄(HINSTANCE)等各种类型的句柄。操作系统给每一个窗口指定的一个唯一的标识号即窗口句柄。句柄就是资源的标识,就象指针一

5、样,我们要索引这样一个资源,就需要通过句柄去索引它。句柄: 资源的标识int x,y; x=30,y=40;/x和y既可以用来表示坐标点,也可以用来表示宽度和高度,还可以用来表示身高和体重。 typedef int WIDTH;typedef int HEIGHT;WIDTH x;HEIGHT y;/好处:我们从变量的类型就可以知道x和y是用来表示宽度和高度。从变量的类型区分变量的用途操作系统会为每个应用程序建立一个消息队列。这个队列是个先进先出的缓冲区。消息队列中的每个元素都是一条消息。操作系统将生成的消息放在消息队列里。第一条消息放入第一格,第二条消息放入第二格,依次类推。应用程序总是取走

6、消息队列中的第一条消息。第一条消息取走后,第二条消息往前移,成为第一条,剩余的消息依次前移。应用程序取得消息后,便能知道用户的操作以及应用程序的状态的变化。当收到消息的时候,会编写针对这个消息的处理代码,这个过程就叫消息响应。消息响应是通过程序实现的,这就是Windows应用程序的主要代码区。消息队列消息队列PostMessageSendMessage在消息响应过程中,我们可能要调用操作系统提供的其他API函数以便完成特定的功能。例如收到窗口关闭的消息,我们就可以调用一个销毁窗口的API函数DestroyWindows去关闭该窗口,或者弹出一个消息框提示用户是否真的要关闭该窗口。消息队列Win

7、dows程序的入口函数int APIENTRY _tWinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow);WinMain函数实例句柄: 当运行一个程序的时候,这个运行的程 序就叫实例。先前应用程序 实例句柄命令行参数显示的状态(1)设计一个窗口类(2)注册窗口类(3)创建窗口(4)显示及更新窗口窗口的创建设计窗口类窗口类的类型Typedef struct tagWNDCLASSEXW UINT cbSize;UINT style;WNDPROC lpfnWndProc;int cbC

8、lsExtra;int cbWndExtra;HINSTANCE hInstance;HICON hIcon;HCURSOR hCursor;HBRUSH hbrBackground;LPCWSTR lpszMenuName;LPCWSTR lpszClassName;HICON hIconSm; WNDCLASSEXW#ifdef UNICODE typedef WNDCLASSEXW WNDCLASSEX;在我们的程序中经常要用到一类变量,这个变量里的 每一位(bit)都对应某一特性。当该变量的某位为1时,表示有该位对应的哪种特性,当该位为0时,即没有该 位所对应的特性。当变量中的某几位同

9、时为1时,就表示同时具有几种特性的组合。一个变量中的哪一位代 表哪种意义,不容易记忆,所以根据特征的英文拼写的大写去定义一些宏,该宏所对应的数值中仅有与该 特征相对应的那一位为1,其余的位都为0。 CS_VREDRAW=0X0001, CS_HREDRAW=0X0002, CS_DBLCKS=0X0008, CS_NOCLOSE=0X0200。它 们的共同点就是只有一位为1,其余位都为0.窗口类的类型如果希望某一变量的数值既有CS_VREDRAW特性, 又有CS_HREDRAW特性,只需使用二进制OR操作符将它们进行或运算相组合。 如style=CS_VREDRAW| CS_HREDRAW|

10、CS_NOCLOSE。如果希望在某一变量原有的几个特征上去掉其中一个 特征,用取反之后再进行与运算就能够实现。 如stylUINT style;WNDPROC lpfnWndProc;int cbClsExtra;int cbWndExtra;HINSTANCE hInstance;HICON hIcon;HCURSOR hCursor;HBRUSH hbrBackground;LPCWSTR lpszMenuName;LPCWSTR lpszClassName;HICON hIconSm; WNDCLASSEXW回调函数的原理:当应用程序收到给某一窗口的消息时(消息通常与窗口相关),就应该调

11、用某一函数来处理这条消息。这一调用过程不用应用程序自己来实施,而由操作系统来完成,但是,回调函数本身的代码必须由应用程序自己完成。对于一条消息,操作系统到底调用应用程序中的哪个函数(回调函数)来处理呢?操作系统调用的就是接受消息的窗口所属的类型中的lpfnWndProc成员指定的函数。每一种不同类型的窗口都有自己专用的回调函数,该函数是通过lpfnWndProc成员指定的。 窗口过程函数汽车厂家生产汽车好比应用程序创建窗口,用户使用汽车好比操作系统管理窗口,某种汽车在销售前就指定好了修理站(类似回调函数),当用户的汽车出现故障后(类似窗口接受到消息),汽车用户(类似操作系统)自己直接找到修理站

12、去修理,不用厂家(类似应用程序)亲自将车送到修理站去修理,但修理站还得由厂家事先建造好。窗口过程函数typedef struct tagWNDCLASSEXW UINT cbSize;UINT style;WNDPROC lpfnWndProc;int cbClsExtra;int cbWndExtra;HINSTANCE hInstance;HICON hIcon;HCURSOR hCursor;HBRUSH hbrBac kground;LPCWSTR lpszMenuName;LPCWSTR lpszClassName;HICON hIconSm; WNDCLASSEXW设计窗口类类的额

13、外参数窗口的实例句柄光标的句柄画刷的句柄菜单的名字类的名字图标的句柄小图标的句柄创建窗口HWND CreateWindow( LPCTSTR lpClassName, /已注册的窗口类的名字 LPCTSTR lpWindowName, / 窗口的名字,即标题栏上显示的文字 DWORD dwStyle, / 窗口的类型 int x, / 窗口显示时左上角的x坐标 int y, /窗口显示时左上角的y坐标 int nWidth, / 窗口宽度 int nHeight, / 窗口高度 HWND hWndParent, / 父窗口的句柄 HMENU hMenu, / 菜单的句柄 HINSTANCE h

14、Instance, / 实例的句柄 LPVOID lpParam / 与窗口相关的附加参数 );消息循环hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINMAIN2);装载指定的加速键表。(加速键就是比如你按Ctrl+N会新建文档,Ctrl+S会保存文档,这些组合键就是加速键。使用加速键首先要建立加速键 的资源,然后在程序初始化的时候LoadAccelerators,然后在WinMain主消息循环中调用TranslateAccelerator)GetMessage是从消息队列中取消息,操作系统会为每个应用程序建立一

15、个消息队列。BOOL GetMessage( LPMSG lpMsg, / 消息HWND hWnd, / 窗口句柄,表明从哪个窗口的消息队列中取消息。 UINT wMsgFilterMin, / 消息的最小值UINT wMsgFilterMax / 消息的最大值 );消息循环通过指定消息的 范围来过滤消息 。如果都为0, 则没有消息的过 滤消息循环TranslateAccelerator(msg.hwnd, hAccelTable, /翻译消息就是对取到的消息对进行转换。当我们按下键盘上的某一个按键时,系统会产生WM_KEYDOWN和WM_KEYUP两个消息,并且参数中提供这个键的虚拟扫描码。但用户按下某个键,可能需要知道具体按下的是哪个字符,在消息的附加参数中提供该键的ASCII码。TranslateMessage会将WM_KEYDOWN和WM_KEYUP两个消息转换成WM_CHAR消息,并且将转换好的消息投递到消息队列中。这个转换过程不会影响原来的消息,只会产生一个新消息。如果我们不用这个函数,则收不到WM_CHAR消息。消息循环DispatchMessage函数的作用是将收到的消息传

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号