




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、Win32消息机制1、消息机制过程驱动:程序是按照我们预先定义好的顺序执行,每执行一步,下一步都已经按照预定的顺序继续执行,直到程序结束。事件驱动:程序执行顺序是无序的,某个时间点所执行的代码,是由外界通知的。由于我们无法决定用户执行顺序,所以代码的执行也是无序的。Win32的消息机制 事件驱动2、Win32消息程序2.1、Win32窗口注册2.2、Win32窗口创建2.3、Win32消息循环2.3.1、GetMessage返回值BOOL,成功获取消息,返回TRUE,但是当获取到WM_QUIT消息时,返回FALSE。可以使用PostQuitMessage向窗口发送WM_QUIT消息 参数意义:MSG 由系统填写,关于消息的参数hWnd GetMessage会根据hWnd接收相对应的窗口的消息。wMsgFilterMin、wMsgFilterMax 消息过滤器,要求GetMessage接收指定范围的消息。2.3.2、TranslateMessageBOOL TranslateMessage( CONST MSG *lpMsg ); 将键盘消息转换成字符消息。1)首先检查是否是键盘按键消息2)如果发现是键盘消息,将会根据按键产生字符的消息,在下一个GetMessage执行时会收到这个消息。3)如果未发现,不做任何处理。2.3.3、DispatchMessageLRESULT DispatchMessage( CONST MSG *lpmsg );根据消息数据内窗口句柄,找到这个窗口的窗口处理函数,调用处理函数,执行消息,进行消息处理。 如果MSG结构中的HWND窗口句柄为空,DispatchMessage不做任何处理2.4、Win32基本消息2.4.1、WM_DESTROY 窗口销毁时的消息,可以做退出或善后的处理。2.4.2、WM_CREATE 窗口创建消息,是窗口创建后,窗口处理函数收到的第一条消息。可以在这个消息内做初始化数据的处理,创建子窗口的处理等WPARAM wParam 不使用 LPARAM lParam 包含CREATESTRUCT指针2.4.3、WM_SIZE当窗口大小发生变化时会收到这个消息,可以在这个消息调整窗口布局。wParam SIZE发生变化时的标识nWidth = LOWORD(lParam);客户区的宽HIWORD(lParam) 客户区的高 2.4.4、WM_SYSCOMMAND 系统命令消息,当点击系统菜单和按钮时,会收到。可以在消息中提示存盘等wParam 系统命令类型LOWORD( lParam) 屏幕x坐标HIWORD(lParam) 屏幕Y坐标2.4.5、WM_ACTIVEAPP 当应用程序的被激活时会收到。2.4.6、WM_PAINT 绘图消息2.4.7、键盘消息2.4.8、鼠标消息2.4.9、WM_TIMER 定时器消息2.5、消息结构MSG 消息结构typedef struct tagMSG HWND hwnd; 消息的窗口句柄 UINT message; 消息标示 WPARAM wParam; 消息的参数 32位 LPARAM lParam; 消息的参数 32位 DWORD time; 消息产生时间 POINT pt; 消息产生时,鼠标的位置 MSG, *PMSG;2.6、消息的获取和发送2.6.1、获取GetMessage/PeekMessageGetMessage 获取消息,阻塞函数PeekMessage 获取消息,非阻塞函数,若无消息则返回2.6.2、发送SendMessage/PostMessageSendMessage 发送消息并等候消息处理结束返回BOOL PostMessage( HWND hWnd, 处理消息窗口 UINT Msg,消息的ID WPARAM wParam, 消息的参数LPARAM lParam ;消息的参数PostMessage 发送消息后立即返回,不关心消息处理的结果3、消息的组成和分类3.1、消息组成窗口句柄/消息ID/消息参数(WPARAM,LPARAM)3.2、消息分类3.2.1、系统消息 由系统定义和使用的消息。消息ID范围为:0 0x03FF(WM_USER-1)例如:WM_CREATE/WM_SIZE;3.2.2、用户定义消息 由应用程序定义使用的消息#define WM_USER 0x0400,从WM_USER的ID开始到0x7FFF,是用户可以使用的消息,WM_APP(0X8000) 0XBFFF:应用程序访问窗口的消息ID0xC000 0xFFFF:应用程序访问消息,使用字符串注册系统产生相应消息ID3.2.3、用户定义消息的使用 1)定义自定义消息的ID:#define WM_FIRSTMSG (WM_USER+1)2)在窗口处理函数中,响应消息switch( nMsg )case WM_FIRSTMSG:/处理函数break; 4、消息队列4.1、消息队列 用于存储消息的内存空间消息在队列中是先入先出4.2、消息队列的分类4.2.1、系统消息队列 由系统维护的消息队列外部4.2.2、应用程序消息队列(线程消息队列)- 属于每个线程的各自拥有的消息队列。5、消息和消息队列5.1、根据消息和消息队列关系,将消息分成两种:队列消息 可以存放在消息队列中的消息非队列消息 发送时不进入消息队列5.2、队列消息 由PostMessage产生首先存放到消息队列当中,然后由GetMessage/PeekMessage取出,然后交由窗口函数进行处理。例如:鼠标消息/键盘消息/WM_PAINT/WM_QUIT/WM_TIMER,是入队列消息。5.3、非队列消息 由SendMessage产生消息直接发送给指定的窗口,然后查找窗口的处理函数,返回处理结果6、消息的获取6.1、消息循环GetMessage 从队列中获取消息,判断是否是WM_QUIT消息,若是返回FALSE,循环结束,否则继续下一步TranslateMessage 翻译按键消息,若发现有按键消息,产生字符消息放入消息队列,继续下一步DispatchMessage 找到消息所发窗口的处理函数,处理函数,处理消息,处理完成后继续消息循环。6.2 GetMessage和PeekMessage6.2.1、从线程消息队列中获取消息,如果找到消息,就返回消息,进行消息循环的处理。6.2.2、如果未找到,则查找系统消息队列,通过向系统消息队列查询,如果找到消息,获取消息并返回,进行消息处理。6.2.3、如果未找到,检查窗口需要重新绘制的范围,如果发现存在重新绘制的范围,会产生WM_PAINT消息,然后进行消息处理,6.2.4、如果未找到,检查定时器消息WM_TIMER,如果发现存在已经到时的定时器,会产生WM_TIMER消息,进行消息处理6.2.5、如果未找到,则执行内存上的管理工作6.2.6、根据函数不同,处理结果不同GetMessage会阻塞等候下一条消息PeekMessage会让出控制权,交给后面的代码执行7、消息发送7.1、消息发送分两种发送(Send)消息 直接发送给指定的窗口并等候结果投递(Post)消息 发送到消息队列中,立刻返回,由消息循环处理7.2、PostMessage(产生队列消息,由于发送后,不等候消息处理结果,所以不能确定消息是否被处理成功) SendMessage(产生非队列消息,可以确定消息是否成功)二、WM_PAINT消息1、WM_PAINT 由于窗口的互相覆盖,产生需要绘制的区域,那么会产生WM_PAINT消息。一般情况下,不直接发送WM_PAINT消息,通过API声明需要绘制的区域来产生WM_PAINT消息。相应的API有:InvalidateRect、InvalidateRng(声明需要重新绘制的区域)2、WM_PAINT的注意点2.1、如果一个消息队列中,有多个WM_PAINT消息,则只有最后一个消息会被处理。2.2、WM_PAINT消息处理中,要清空需要被绘制的区域。BeginPaint函数处理3、WM_PAINT的使用3.1、WM_PAINT开始时,必须调用BeginPaint3.2、WM_PAINT处理后,必须调用EndPaint三、键盘消息1、按键消息WM_KEYDOWN 当键被按下时产生WM_KEYUP 当键被释放时产生WM_SYSKEYDOWN 当系统间被按下时产生ALT/F10WM_SYSKEYUP 当系统键被释放时产生2、字符消息WM_CHAR 当有字符键被按下时产生,TranslateMessage会将WM_KEYDOWN可以显示的按键转换成WM_CHAR消息3、消息参数WPARAM 虚拟键码; LPARAM 相关的按键信息。4、消息的使用4.1、当有按键消息时首先进入系统消息队列,然后被程序的消息循环获取4.2、消息的处理5、键盘消息的顺序对于可显示字符:WM_KEYDOWN WM_CHAR WM_KEYUP对于不可显示的字符:WM_KEYDOWN WM_KEYUP对于系统键: WM_SYSKEYDOWN WM_SYSKEYUP如果按键一直不释放,会重复产生WM_KEYDOWN(WM_CHAR)四、鼠标消息1、鼠标消息 1)基鼠标消息WM_LBUTTONDOWNWM_LBUTTONUPWM_RBUTTONDOWNWM_RBUTTONUPWM_MOUSEMOVEWM_LBUTTONDBLCLKWM_RBUTTONDBLCLKWM_MOUSEWHEEL:滚轮消息2、消息参数WPARAM 当前键盘按键状态,例如MK_CONTROL/MK_SHIFT/MK_LBUTTON等LPARAM 当前鼠标的坐标X坐标:LOWORD( LPARAM); 低16位, Y坐标:HIWORD( LPARAM)坐标的原点是窗口客户区的左上角参数具体内容和具体鼠标消息有稍微不同3、消息的使用把客户区坐标转换为屏幕坐标BOOL ClientToScreen( HWND hWnd, LPPOINT lpPoint); POINT ptScreen = 0;ptScreen.x = nX;ptScreen.y = nY;/客户区坐标转换为当前屏幕的坐标ClientToScreen( hWnd,&ptScreen );3.1、基本鼠标消息,只需在窗口处理函数中增加消息处理即可,当消息来临,获取鼠标位置和按键状态。case WM_MOUSEMOVE:int nX = LOWORD( lParam );int nY = HIWORD( lParam );3.2、双击消息 3.2.1、窗口注册类型要增加CS_DBLCLKS类型wce.style = CS_HREDRAW|CS_HREDRAW|CS_DBLCLKS;3.2.2、在窗口处理函数中增加消息处理3.2.3、产生过程:WM_LBUTTONDOWN WM_LBUTTONUP_WM_LBUTTONDBLCLK - WM_LBUTTONUP连续两次LBUTTONDOWN的时间间隔小于预定义的双击时间间隔时,会产生WM_LBUTTONDBLCLK消息,这个间隔时间可以改变,在控制面板中设置3.3、滚轮消息3.3.1、由于WM_MOUSEWHEEL需要WINNT4.0以上版本支持,所以需要在Window.h的头文件前,增加 #define _WIN32_WINNT 0x04003.3.2、在窗口处理函数中增加消息处理3.3.3、参数LPARAM 与其他鼠标消息类同WPARAM LOWORD( WPARAM ) 表示按键状态- HIWORD(WPARAM)表示滚动的幅度,为120的倍数,可以为正负值。正值:滚轮向上滚动,一般窗口向下滚动。负值:滚轮向下滚动,一般窗口向上滚动五、定时器消息1、定时器消息WM_TIMER按照定时器设置的时间段,自动向窗口发送一个定时器消息优先级比较低,精度比较低,毫秒级别,消息产生时间精度也比较低。2、消息和函数WM_TIMER,- 消息IDWPARAM 定时器的ID,通过ID来区分定时器LPARAM 定时器的处理函数,TimeProc的地址SetTimer 设置定时器UINT_PTR SetTimer( HWND hWnd, 窗口句柄 UINT_PTR nIDEvent,定时器的ID,可以为0,0表示不预设ID UINT uElapse,时间间隔,毫秒级别 TIMERPROC lpTimerFunc定时器的处理函数);返回一个创建好的定时器IDKillTimer 结束定时器BOOL KillTimer( HWND hWnd, UINT_PTR uIDEvent );TimerProc:VOID CALLBACK TimerProc( HWND hwnd,UINT uMsg, UINT_PTR idEvent, DWORD dwTime); 定时器的处理函数。(窗口句柄,WM_TIMER消息ID,定时器ID,当前的系统时间) 3、使用方式3.1、创建定时器3.1.1、指定HWND句柄后,那么TimeProc参数可以为空,那么WM_TIMER消息将会发送给指定的窗口,如果未指定,那么TimerProc不能为空,必须指定定时器的处理程序。SetTimer( NULL,1002,10*1000,TimerProc1 );3.1.2、如果指定了定时器ID,SetTimer会按照这个ID创建定时器,如果未指定,会返回一个创建的定时器ID。g_nTimerID1 = SetTimer( hWnd,0,7*1000,NULL );3.2、处理消息可以根据消息传入的定时器ID号,分别处理。3.3、结束定时器在不使用时,KillTimer结束定时器六、菜单1、菜单的使用1.1、菜单的创建菜单创建后,会返回HMENU句柄菜单项 - 每个菜单项会有一个ID号,可以根据这个ID执行不同的操作CreateMenu - MENU 菜单 HMENU CreateMenu(VOID);CreatePopupMenu - POPUPMENU 弹出式菜单HMENU CreatePopupMenu(VOID);AppendMenu 增加菜单项BOOL AppendMenu( HMENU hMenu, 菜单句柄 UINT uFlags, 菜单项的标识 UINT_PTR uIDNewItem, 菜单的ID或者是弹出式菜单的窗口句柄 LPCTSTR lpNewItem 菜单项的名称 );MF_STRING lpNewItem是一个字符串MF_POP uIDNewItem是一个子菜单句柄MF_SEPARATOR 增加分割线MF_CHECKED/MF_UNCHECKED 设置和取消菜单项的对勾NF_DISABLED/MF_ENABLE2.2、菜单的命令响应2.2.1、WM_COMMAND消息当用户点击菜单或某些控件(按钮),系统会向窗口发送WM_COMMAND消息。 WPARAM - HIWORD:通知消息标识- LOWORD:菜单或控件的ID号LPARAM :控件的句柄 2.2.2、命令处理根据菜单项的ID号作响应处理2.3、菜单项的状态2.3.1、WM_INITMENUPOPUP消息当用户点击菜单,在弹出的菜单显示之前产生。系统会向窗口发送WM_INITMENUPOPUP消息 WPARAM 菜单的句柄LPARAM LOWORD :菜单位置HIWORD :是否是系统菜单2.3.2、命令处理根据WPARAM的菜单句柄,使用MenuAPI函数,修改菜单状态。CheckMenuItem(选择)、EnableMenuItem(允许和禁止)、SetMenuInfo(可以设置更多信息)七、系统菜单1、系统菜单执行系统提供的窗口命令,例如关闭、最大化。本质上喝普通菜单一样,所以我们也可以在程序中使用这个菜单。2、系统菜单的使用2.1、获取系统菜单GetSysMenuHMENU GetSystemMenu( HWND hWnd, BOOL bRevert );(要获取的窗口句柄,获取时重置标识)bRevert TRUE:表示重置,会将菜单置成默认的状态,并返回菜单句柄;FALSE:表示不重置,获取到当前菜单的状态;2.2、修改系统菜单:增加、删除等AppendMenu、InsertMenu、RemoveMenu BOOL RemoveMenu( HMENU hMenu, UINT uPosition, UINT uFlags);2.3、系统菜单的命令响应系统菜单的命令响应是在WM_SYSCOMMAND中完成WPARAM LOWORD(wParam) 增加的菜单的ID八、右键菜单1、右键菜单当在窗口点击鼠标右键时,弹出的菜单。2、右键菜单的使用2.1、创建菜单CreatePopupMenu2.2、菜单增加AppendMenu。2.3、菜单的显示TrackPopupMenu BOOL TrackPopupMenu( HMENU hMenu,UINT uFlags,int x,int y, int nReserved, HWND hWnd, CONST RECT *prcRect );(要显示的菜单句柄,显示的方式,在屏幕上坐标位置, 保留值,必须为0,处理菜单命令的窗口句柄,忽略值)2.4、菜单的命令处理WM_COMMAND2.5、使用右键菜单的位置2.5.1、WM_RBUTTONUP消息WM_RBUTTONUP中,添加菜单的创建及显示,右键消息坐标,转换成屏幕坐标使用:ClientToScreen2.5.2、WM_CONTEXTMENU消息用于显示右键菜单消息WPARAM 右键点击时对应窗口句柄LPARAM 右键抬起时鼠标的屏幕坐标位置LOWORD X屏幕坐标,HIWORD Y屏幕坐标2.5.3、WM_RBUTTONUP 1)坐标系不同,RBUTTONUP客户区坐标,CONTEXTMENU屏幕坐标2)先有WM_RBUTTONUP后有WM_CONTEXTMENU三、资源的使用1、资源文件图标、光标、字符串、菜单、加速键、位图、对话框资源等资源脚本文件 扩展名为RC文件。定义了资源和相关文件等等信息资源编译器 RC.exe2、图标资源ICON2.1、常用的几种大小:16*16, 32*32, 48*48,128*1282.2、使用MAKEINTRESOURCE把整数值转换为资源类型LoadIcon(资源所在应用程序的实例句柄,ID字符串)HICON LoadIcon( HINSTANCE hInstance, LPCTSTR lpIconName )2.3、系统提供的图标hInstance为空,lpIconName为定义的系统图标2.4、自己绘制的图标hInstance为图标所在的应用程序实例句柄,lpIconName为ID号2.5、一个图标文件中,可以包含多种大小、颜色不同的图标,系统使用图标时,通过大小来匹配,如果未找到大小完全一致的,那么会使用大小最接近的图标格式替换。3、光标资源3.1、光标资源Hotspot 热点 :16*16 。可以产生鼠标点击的位置3.2、光标的使用LoadCursor 参数同上HCURSOR LoadCursor( HINSTANCE hInstance, LPCTSTR lpCursorName );3.3、系统的光标hInstance为空,lpCursorName指定为系统的光标即可获得3.4、自绘制的光标hInstance不能为空。3.5、WM_SETCURSOR当鼠标在窗口内就会产生,可以在程序执行过程中修改鼠标的样式。WPARAM 窗口句柄,LOWORD(lParam) 所在位置的标识,点击的区域HIWORD(lParam)鼠标的消息IDBOOL GetCursorPos( LPPOINT lpPoint );得到的是屏幕坐标4、字符串资源4.1、包含字符串的资源4.2、使用LoadSt
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 元宵节做元宵活动的作文14篇范文
- 小学数学空间与几何概念学习与实践教案
- 水痘预防及护理措施
- 冬季农民大培训课件
- 装饰装修设计合同范本4篇
- 流感病人护理措施
- 前交叉韧带损伤护理
- 脑卒中后康复护理
- 专业培训服务协议与培训质量保障措施条款
- 科学使用农药知识课件
- 台球厅合伙协议合同范本
- 女装销售店长培训课件
- 2025年潍坊市中考物理真题卷(含答案)
- 连锁餐饮合伙合同范本
- 酒管专业导论考试题及答案
- 2025外研社小学英语四年级上册单词表(带音标)
- 2025至2030中国体育赛事行业市场发展分析及发展前景与投资报告
- 小学戏剧教学课本剧剧本集锦
- 【一年级上册语文统编版(2024)-第四单元汉语拼音】14. ang eng ing ong第二课时课件
- 2025年交管12123驾驶证学法减分及驾驶安全理论知识试题库(附含答案)
- 知识产权保护与服务平台创新创业项目商业计划书
评论
0/150
提交评论