




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2022/10/111自我介绍!Email: 姓名: 刘晓翔QQ: 13134954性别: 男年龄: xxx籍贯: 湖北联系方式:手机: 135438945892022/10/11Windows编程主讲:刘晓翔2022/10/113前言什么是Windows编程?1. 你编写的程序是否遵循了Windows的编程模型?2.是否调用了Windows操作系统的应用程序编程接口函数API,或者对其封装后的基础类库(如MFC)。2022/10/114前言关于Windows编程的三个问题1. 什么是Windows API? 2. 什么是MFC?3. 为什么要使用MFC?2022/10/115前言1. 什么是
2、 Windows API? 从Windows应用程序,操作系统,计算机硬件之间的相互关系开始说起 应用程序的机能就是:通知操作系统控制计算机硬件,执行某个具体的动作,完成特定的功能。 例如:操作系统能够控制声卡发出声音,但它并不知道应该何时发出何种声音,需要应用程序告诉操作系统该发出什么样的声音。那么,应用程序是如何通知操作系统执行某个功能的呢?2022/10/116前言1. 什么是 Windows API?(续) 有过编程经验的同学都应该知道,在传统应用程序中要完成某个功能,都是以函数调用的形式实现的,同样,Windows应用程序也是以函数调用的方式来通知操作系统执行相应的功能的。 操作系统
3、所能够完成的每一个特殊功能通常都有一个函数与其对应,也就是说,操作系统把它所能够完成的功能以函数的形式提供给应用程序使用,应用程序对这些函数的调用就叫做系统调用,这些函数的集合就是Windows应用程序编程接口(Application Programming Interface),简称Windows API。 如CreateWindow就是一个API函数,应用程序中调用这个函数,操作系统就会按照该函数提供的参数信息产生一个相应的窗口。2022/10/117前言1. 什么是 Windows API?(续) Windows编程的本质: 利用Windows API 函数编写应用程序,让操作系统完成某
4、种特定的功能 。Windows/System32/Kernel32.dll、 USER32.dll、GDI32.dllWindows API 函数在哪里?怎样使用Windows API?C和Windows SDK开发包( API函数是用纯C写的,都在windows.h中有声明)然而如今,C+取代了C,成为专业Windows程序员首选的语言,所以MFC横空出世了2022/10/118前言2. 什么是 MFC? MFC英文全称为Microsoft Foundation Classes (微软基础类库),是把Windows API进行封装的类库,它是一个类的集合,通过覆盖Windows API,为编
5、程提供了一个面向对象的界面。 MFC使Windows程序员能够利用C+面象对象的特性进行编程。2022/10/119前言3. 为什么要使用MFC?可重用性封装后使方法和属性更紧密的捆绑常用的功能自动化,减少编写代码的数量提供应用程序的框架结构 框架结构提供了抽象功能,它远远超出了Windows API的功能。例如:MFC的文档/视图体系结构在API上建造了一个功能强大的基础结构,它把程序中数据的图形表示(或称为视图)与数据本身分开。这种抽象对API而言完全是陌生的,而且在MFC框架结构之外或类似的类库中也不存在。2022/10/1110关于教材参考书籍(Windows 编程四大法宝)VC深入详
6、解孙鑫著 电子工业出版社深入浅出MFC(第二版)侯俊杰著 华中科技大学出版社Windows程序设计(第五版)Charles Petzold著 北京大学出版社( Microsoft Press )VisualC+技术内幕(第四版)DavidJ.Kruglinski著 清华大学出版社( Microsoft Press )2022/10/1111内容安排Windows程序内部运行机制 (API)C+ 进阶MFC框架程序 (“文档/视图”体系结构程序)在窗口中绘图在窗口中编辑文本菜单编程对话框界面设计(外观、工具栏、状态栏)动态链接库多线程应用程序2022/10/11第一讲Windows程序内部运行原
7、理2022/10/1113Windows 程序内部运行机制Windows编程模型事件驱动编程模型以消息为基础,事件驱动之WM_PAINTWM_KEYDOWNWM_LBUTTONDOWN消息响应消息响应消息响应DefWindowProc来源于操作系统的消息消息队列WinMain消息循环发送消息窗口过程未处理的消息应用程序窗口交还给操作系统操作系统实现特定功能2022/10/1114Windows 程序内部运行机制消息、消息队列、消息循环 应用程序开始执行后,系统都会为该程序创建一个消息队列,这个消息队列用来存放该程序创建的窗口的消息(消息通常与窗口相关)。 例如,当我们按下鼠标左键的时候,将会产
8、生消息,系统会将这个消息放到窗口所属的应用程序的消息队列中,等待应用程序的处理。产生的消息都会依次放到消息队列中,而应用程序则通过一个消息循环不断地从消息队列中取出消息,并进行响应。2022/10/1115Windows 程序内部运行机制消息响应与窗口过程 如用户在某个程序活动时按了一下键盘,操作系统马上能够感知到这一事件,并且能够知道用户按下的是哪一个键,操作系统并不决定对这一事件如何作出反应,而是将这一事件转交给应用程序,由应用程序决定如何对这一事件作出反应。对事件作出反应的过程就是消息响应,各种消息响应放在一起组成了窗口过程。 2022/10/1116Windows 程序内部运行机制Wi
9、ndows API 中消息的定义 操作系统是怎样将感知到的事件传递给应用程序的呢?这是通过消息机制(Message)来实现的。操作系统将每个事件都包装成一个称为消息的结构体MSG来传递给应用程序,参看MSDN。MSG结构定义如下: typedef struct tagMSG HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; MSG; 2022/10/1117Windows 程序内部运行机制小小知识点“句柄” 句柄(HANDLE),资源的标识。 操作系统要管理和操作各种各样的资源,都是通过句柄
10、来找到对应的资源。按资源的类型,又可将句柄细分成图标句柄(HICON),光标句柄(HCURSOR),窗口句柄(HWND),应用程序实例句柄(HINSTANCE)等等各种类型的句柄。 操作系统给每一个窗口指定的一个唯一的标识号即窗口句柄。 2022/10/1118Windows 程序内部运行机制小小知识点API中对数据类型的宏定义好处:让数据类型具备语义信息,从变量的类型就可以区分变量的用途!int x, y;x = 30;y = 30;/x和y既可以用来表示坐标点,也可以用来表示宽度和高度,还可以用来表示身高和体重。typedef int WIDTHtypedef int HEIGHTWIDT
11、H x;HEIGHT y;/我们从变量的类型上就可以知道x和y是用来表示宽度和高度。2022/10/1119Windows 程序内部运行机制编写Windows应用程序的要素消息响应消息响应消息响应DefWindowProcWinMain消息循环发送消息窗口过程未处理的消息应用程序1 入口函数WinMain2 创建窗口3 消息循环与发送消息4 窗口过程与消息响应消息窗口2022/10/1120Windows 程序内部运行机制1.入口函数WinMainint WINAPI WinMain( HINSTANCE hInstance, / 当前应用程序实例句炳 HINSTANCE hPrevInsta
12、nce, / 永远为NULL LPSTR lpCmdLine, / 命令行参数 int nCmdShow / 窗口显示时的状态);2022/10/1121Windows 程序内部运行机制2. 创建窗口 创建一个完整的窗口需要经过下面四个操作步骤: Step1: 设计一个窗口类; Step2: 注册窗口类; Step3: 创建窗口; Step4: 显示及更新窗口。2022/10/1122Windows 程序内部运行机制设计窗口类typedef struct _WNDCLASS UINT style; /窗口类样式 WNDPROClpfnWndProc; /窗口过程函数指针 int cbClsEx
13、tra; /窗口类附加内存字节数,通常为0 int cbWndExtra; /窗口附加内存字节数,通常为0 HANDLE hInstance; /应用程序实例句柄 HICON hIcon; /标题栏图标 HCURSOR hCursor; /光标 HBRUSH hbrBackground; /窗口背景颜色 LPCTSTR lpszMenuName; /菜单资源名称 LPCTSTR lpszClassName; /窗口类名称 WNDCLASS; 2022/10/1123Windows 程序内部运行机制创建窗口HWND CreateWindow( LPCTSTR lpClassName, / 已注册
14、的窗口类名称 LPCTSTR lpWindowName, / 窗口标题栏中显示的文本 DWORD dwStyle, / 窗口样式 int x, / 水平坐标 int y, / 垂直坐标 int nWidth, / 宽度 int nHeight, / 高度 HWND hWndParent, / 父窗口句柄 HMENU hMenu, / 菜单句柄 HINSTANCE hInstance, / 应用程序实例句柄 LPVOID lpParam / 用于多文档程序的附加参数,单文档为NULL ); 2022/10/1124Windows 程序内部运行机制3. 消息循环与发送消息MSG msg;while
15、 (GetMessage(&msg,NULL,0,0) /从消息队列获取消息TranslateMessage(&msg); /消息解释DispatchMessage(&msg); /将消息发送到“窗口过程”2022/10/1125Windows 程序内部运行机制GetMessageBOOL GetMessage( LPMSG lpMsg, / 消息结构体指针,返回消息信息 HWND hWnd, / 窗口句柄 ,通常设为NULL UINT wMsgFilterMin, / 消息过滤最小值 UINT wMsgFilterMax / 消息过滤最大值 ); GetMessage从线程的消息队列中取出消
16、息,取出的消息保存在事先定义好的消息的结构体对象中。 GetMessage函数取到除WM_QUIT外的消息均返回非零值,只有在接收到WM_QUIT消息时,才返回0。 什么时候才会收到WM_QUIT呢?(见窗口过程)2022/10/1126Windows 程序内部运行机制TranslateMessage TranslateMessage函数用于将虚拟键消息转换为字符消息。当我们敲击键盘上的某个字符键时,系统将产生WM_KEYDOWN和WM_KEYUP消息。这两个消息的附加参数(wParam和lParam)包含的是虚拟键代码和扫描码等信息,而我们在程序中往往需要得到某个字符的ASCII码,Tran
17、slateMessage这个函数就可以将WM_KEYDOWN和WM_KEYUP消息的组合转换为一条WM_CHAR消息,该消息的WParam附加参数包含了字符的ASCII码),并将转换后的新消息投递到调用线程的消息队列中。注意,Translate函数并不会修改原有的信息,他只是产生新的消息并投递到消息队列中。2022/10/1127Windows 程序内部运行机制DispatchMessage DispatchMessage分派一个消息到窗口过程。由窗口过程函数对消息进行处理。 DispatchMessage实际上是将消息回传给操作系统,再由操作系统调用窗口过程函数对消息进行处理。2022/10
18、/1128 对于一条消息,操作系统到底调用应用程序中的哪个函数来处理呢? 操作系统调用的就是接受消息的窗口所属的类型中的lpfnWndProc成员(还记得窗口类的第二个成员吗?)指定的函数。每一种不同类型的窗口都有自己专用的回调函数,该函数就是通过lpfnWndProc成员指定的,也称回调函数。 回调函数的原理是这样的,当应用程序收到给某一窗口的消息时,就应该调用某一函数来处理这条消息。这一调用过程不用应用程序自己来实施,而由操作系统来完成,但是,回调函数本身的代码必须由应用程序自己完成。 Windows 程序内部运行机制窗口过程函数2022/10/1129Windows 程序内部运行机制5.
19、 窗口过程与响应消息LRESULT CALLBACK MyWndProc( HWND hwnd, / handle to window UINT uMsg, / message identifier WPARAM wParam, / first message parameter LPARAM lParam / second message parameter) switch (uMsg) case WM_PAINT: /响应消息 case WM_KEYDOWN: /响应消息 case WM_LBUTTONDOWN: /响应消息 default: return DefWindowProc(hw
20、nd,uMsg,wParam,lParam); return 0;2022/10/1130Windows 程序内部运行机制回调函数 凡是由你设计而却由Windows系统调用的函数,统称为Callback函数。这些函数都有一定的类型,以配合Windows的调用操作。 除了窗口过程函数,Windows API还有一些其它的回调函数,例如SetTimer、LineDDA、EnumObject。这种函数会在进行某种行为之后或满足某种状态之时,操作系统自动调用该函数。2022/10/1131Windows 程序内部运行机制小小知识:函数的三种调用方式_cdecl 是C/C+和MFC程序默认使用的调用约定
21、,也可以在函数声明时加上_cdecl关键字来手工指定。采用_cdecl约定时,函数参数按照从右到左的顺序入栈,并且由调用函数者把参数弹出栈以清理堆栈。因此,实现可变参数的函数只能使用该调用约定。由于每一个使用_cdecl约定的函数都要包含清理堆栈的代码,所以产生的可执行文件大小会比较大。_stdcall 调用约定用于调用Win32 API函数。采用_stdcall约定时,函数参数按照从右到左的顺序入栈,被调用的函数在返回前清理传送参数的栈,函数参数个数固定。由于函数体本身知道传进来的参数个数,因此被调用的函数可以在返回前用一条ret n指令直接清理传递参数的堆栈。_fastcall 约定用于对
22、性能要求非常高的场合。_fastcall约定将函数的从左边开始的两个大小不大于4个字节(DWORD)的参数分别放在ECX和EDX寄存器,其余的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的堆栈。_fastcall可以写成_fastcall。 2022/10/1132Windows 程序内部运行机制三种调用方式的特别说明在默认情况下,VC采用_cdecl方式,因此可以省略.WINAPI一般用于修饰动态链接库中导出函数 CALLBACK仅用于修饰回调函数 2022/10/1133Windows 程序内部运行机制DefWindowProc 我们的程序无论多大都不可能将所有的消息都处理,
23、所以我们必须有一个机制让不感兴趣的、不需要我们处理的消息,交还给Windows操作系统为我们处理,这个过程就是由DefWindowProc函数来实现的,也是每个程序所必备的。2022/10/1134Windows 程序内部运行机制WM_DESTROY 当窗口被销毁时会产生这个消息(通常也是准备退出应用程序的时候),对于这个消息的响应是每个程序所必备的。怎样响应呢? 响应方式就是调用PostQuitMessage函数,该函数会在消息队列中添加一个WM_QUIT消息,准备让由消息循环中的GetMessage取得。当消息循环中的收到WM_QUIT消息时,GetMessage会传回0,从而结束消息循环,进而结束整个程序。 2022/10/1135Windows 程序内部运行机制WM_QUIT & PostQuitMessage PostQuitMessage会发送WM_QUIT给消息队列。注意,WM_QUIT永远不会到达窗口过程,因为GetMessage得到WM_QUIT后就会返回0,从而结束消息循环,程序退出。 强烈建议PostQuitMessage放在WM_DESTROY消息响应里面调用,让程序正常有序的结束,因为通常销毁窗口是程序运行的最后一步。 当然,PostQuitMe
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 配电安规习题+参考答案
- 河南省上蔡一高2025年高三3月份模拟考试英语试题含解析
- 机修钳工(设备钳工)复习题及答案
- 浙江省宁波四中2025届高三下学期第五次调研考试英语试题含解析
- 2025年福建省厦门二中高考考前模拟英语试题含答案
- 江苏省连云港市海州区2024-2025学年高一下学期4月期中学业水平质量监测化学试题(原卷版+解析版)
- 纸容器食品安全包装要求与检测考核试卷
- 管道工程绿色施工技术创新动态与发展趋势考核试卷
- 美容仪器电路设计与优化案例分析考核试卷
- 航空物流企业的供应链金融创新考核试卷
- 绿化养护劳务服务投标方案(技术标)
- 风电场道路及风机基础工程爆破专项施工方案
- 油烟机清洗安全合同协议书
- 危险性较大的分部分项工程清单(表格版)
- 国开2024春《人文英语3》第1-4单元作文练习参考答案
- 【电石乙炔法制备氯乙烯的生产工艺设计9600字(论文)】
- 2024年广东省梅州市中考一模历史试题(无答案)
- 2024年北京铁路局集团招聘笔试参考题库含答案解析
- 发电机安全运行常识
- 火灾安全教育培训主题
- 如何写好校园新闻稿
评论
0/150
提交评论