Windows程序运行原理解析

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

• cbClsExtra 类的额外内存,一般设为0 • cbWndExtra 窗口的额外内存,一般设为0 • hInstance 当前应用程序实例句柄,设计窗口类时需要知道属于哪 个应用程序 • hIcon 图标句柄,LoadIcon • hCursor 光标 • hbrBackground 窗口背景 • lpszMenuName 菜单名称,一般为NULL • lpszClassName 设计的类的名称,窗口名。
• hInstance 当前应用程序实例句柄,即运行中的程序。 • hPrevInstance 先前应用程序实例句柄,即先前运行的程序,一般 为空。 • lpCmdLine 指向字符串的指针,命令行参数 • nCmdShow 显示状态,窗口如何显示
窗口的创建
创建一个完整的窗口需要经过下面四个操作步骤: • 设计一个窗口类; • 注册窗口类; • 创建窗口; • 显示及更新窗口。
• 消息(message) • UINT unsigned int,如键盘按下,键盘按下等的事件。 • wParam 整型变量,消息的附加参数 • lParam整型变量,消息的附加参数 • Time DWORD类型,double word 消息投递的时间 • Pt point结构体类型 消息投递时光标的位置
• 操作系统把它所能够完成的功能以函数的形式提供给应用程序使 用,应用程序对这些函数的调用就叫做系统调用,这些函数的集 合就是Windows操作系统提供给应用程序编程的接口(Application Programming Interface),简称Windows API。
• ④表示操作系统能够将输入设备的变化上传给应用程序。如用户 在某个程序活动时按了一下键盘,操作系统马上能够感知到这一 事件,并且能够知道用户按下的是哪一个键,操作系统并不决定 对这一事件如何作出反应,而是将这一事件转交给应用程序,由 应用程序决定如何对这一事件作出反应。
• 第二个成员变量lpfnWndProc指定了这一类型窗口的过程函数,也 称回调函数。回调函数的原理:当应用程序收到给某一窗口的消 息时(消息通常与窗口相关的),就应该调用某一函数来处理这 条消息。这一调用过程不用应用程序自己来实施,而由操作系统 来完成,但是,回调函数本身的代码必须由应用程序自己完成。 对于一条消息,操作系统到底调用应用程序中的哪个函数,即是 接受消息的窗口所属的类型中的lpfnWndProc成员指定的函数。每 一种不同类型的窗口都有自己专用的回调函数,该函数就是通过 lpfnWndProc成员指定的。
Windows程序运行原理解析
• 讲解人:杨松林 • 邮箱:1063607818@qq.com
Windows应用程序,操作系统,计算机硬 件之间的相互关系
应用程序 ③ ④ 操作系统 ① ② 消息队列
输入输出设备
• ①操作系统能够操作输出设备。 • ②操作系统能够感知输入状态的变化。 • ③表示应用程序可以通知操作系统执行某个具体的动作,应用程 序以函数调用的方式来通知操作系统执行相应的功能的。
Windows的消息机制
窗口过程 应用程序 ③ ④ 操作系统 ① ② 消息队列
关于消息及消息队列
操作系统是怎样将感知到的事件传递给应用程序的呢?这是通过消息机制(Message) 来实现的。操作系统将每个事件都包装成一个称为消息的结构体MSG来传递给应用程 序,参看MSDN。 MSG结构定义如下: typedef struct tagMSG { HWND hwnd; //窗口的句柄 UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG;
• 注册窗口 • RegisterClass 注册窗口类,需要传入窗口类结构体指针
源自文库
创建窗口类
• 先创建窗口句柄 HWND • 创建 CreateWindow
• LPCTSTR lpClassName 即为设计类的名称 • LPCTSTR lpWindowName, 创建窗口的名称(标题栏的名称),自己定 • DWORD dwStyle, 窗口类型,如可沉,可调等 • int x,窗口水平坐标 • int y,窗口垂直坐标 • int nWidth,窗口的宽度 • int nHeight,窗口的高度 • HWND hWndParent, 副窗口句柄 • HMENU hMenu, 菜单的句柄 • HANDLE hlnstance, 当前应用程序实例句柄 • LPVOID lpParam 附加参数,一般为NULL
• 句柄(HANDLE),资源的标识。
• 操作系统要管理和操作这些资源,都是通过句柄来找到对应的资 源。按资源的类型,又可将句柄细分成图标句柄(HICON),光 标句柄(HCURSOR),窗口句柄(HWND),应用程序实例句柄 (HINSTANCE)等等各种类型的句柄。操作系统给每一个窗口指 定的一个唯一的标识号即窗口句柄。
消息循环
• MSG msg; • While (GetMessage(&msg,NULL,0,0)) • {TranslateMessage(&msg); • DispatchMessage(&msg);} • TranslateMessage将虚拟消息转为为字符消息(WM_CHAR) • DispatchMessage函数分派一个消息到窗口过程,由窗口过程函数对 消息处理,实际上将消息回传给操作系统,操作系统再调用窗口过 程函数对消息处理。
设计窗口类
• typedef struct _WNDCLASS { • UINT style; //窗口类的类型 • WNDPROC lpfnWndProc; • int cbClsExtra; • int cbWndExtra; • HANDLE hInstance; • HICON hIcon; • HCURSOR hCursor; • HBRUSH hbrBackground; • LPCTSTR lpszMenuName; • LPCTSTR lpszClassName; • } WNDCLASS;
显示窗口
• Showwindow(hwnd,显示窗口的状态) • UpdateWindow(hwnd)
消息循环
• 不断从消息队列中取消息,进行响应 • BOOL GetMessage( • LPMSG lpMsg,从线程消息队列中取消息保存到该结构体对象中 • HWND hWnd,指定接受属于哪个窗口消息,NULL则接受接收调用线 程的所有窗口消息 • UINT wMsgFilterMin 获取消息最小值,长为0 • UINT wMsgFilterMax 获取消息最大值,长为0 •) • GetMessage函数接收除WM_QUIT外的消息均返回零值.
WinMain函数(操作系统调用)
• Windows程序的入口函数 int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPSTR lpCmdLine, // command line int nCmdShow // show state );
窗口过程函数的编写
• LRESULT CALLBACK WindowProc( • HWND hwnd;窗口句柄 • UINT uMsg;消息代码 • WPARAM wParam;消息代码附加参数 • LPARAM lParam;消息代码附加参数 •) • 函数内部使用switch/case语句来确定窗口过程接收的是什么消息, 以及如何对这个消息进行处理.
相关文档
最新文档