您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > L17-18 Windows消息
2D游戏平台开发第3章Windows消息主要内容:学习目标:第3章Windows消息实现菜单消息菜单的响应定时器滚动条灵活运用实现菜单消息掌握菜单的响应掌握定时器的使用掌握滚动条的使用重点:难点:实现菜单消息菜单的响应定时器滚动条实现菜单消息菜单的响应定时器滚动条第3章Windows消息第3章Windows消息3.6菜单3.6.2实现菜单消息在进行Windows程序设计中,加载菜单的方法有以下3种:1)在窗口类中加载菜单。wndClass.lpszMenuName=MAKEINTRESOURCE(IDR_MENU1);MAKEINTRESOURCE是一个宏,将菜单资源ID转换为字符形式。在窗口类中设置lpszMenuName参数后,使用该窗口类创建的窗口将有相同的菜单。第3章Windows消息3.6菜单2)在创建窗口时加载菜单。应用程序首先使用LoadMenu函数创建菜单句柄,然后将生成的菜单句柄作为参数提供给CreateWindow函数创建窗口时使用。HMENUhMenu;hMenu=LoadMenu(hInstance,MAKEINTRESOURCE(IDR_NEW_MENU));hwnd=CreateWindow(szAppName,菜单示例,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,hMenu,hInstance,NULL);3)动态加载菜单。第3章Windows消息3.6菜单应用程序调用函数LoadMenu获取菜单句柄后,还可通过调用函数SetMenu动态加载菜单,以提高应用程序的灵活性。动态加载菜单可在同一个应用程序中实现多种不同的菜单操作界面。动态创建菜单可以使系统资源更加节省。在应用程序中动态创建菜单首先调用函数CreateMenu创建一个空菜单,然后添加相应的菜单项。HMENUhMenu;hMenu=CreateMenu(VOID);第3章Windows消息3.6菜单在程序运行中也可以添加,删除菜单项或设置菜单的状态可以用AppendMenu在菜单的尾部增加菜单项BOOLAppendMenu(HMENUhMenu,UINTuFlags,UINTuIDNewltem,LPCTSTRlpNewltem);InsertMenu可以在菜单中插入菜单项BOOLInsertMenu(HMENUhMenu,UINTuPosition,UINTuFlags,UINTuIDNewltem,LPCTSTRlpNewltem);DeleteMenu可以在菜单中删除菜单项BOOLDeleteMenu(HMENUhMenu,UINTuPosition,UINTuFlags);第3章Windows消息3.6菜单ModifyMenu可以在菜单中修改菜单项BOOLModifyMenu(HMENUhMenu,UINTuPosition,UINTuFlags,UINTuIDNewltem,LPCTSTRlpNewltem);EnableMenuItem可以禁止或激活菜单项BOOLEnableMenuItem(HMENUhMenu,UINTuIDEnableItem,UINTuEnable);CreateMenu创建的菜单是最上一级别的菜单,类似文件、编辑、视图。在文件下面还可以有菜单。而CreatePopupMenu创建的菜单不能横向排列的,只能是一个纵向排列的。3.6.3菜单的响应第3章Windows消息3.6菜单所有菜单引发的窗口消息都是WM_COMMAND消息。对不同菜单的区别是通过消息参数wParam,这个参数的低字节值表示的是菜单的ID。caseWM_COMMAND:{wmId=LOWORD(wParam);switch(wmId){caseIDM_EXIT:DestroyWindow(hWnd);break;}break;}第3章Windows消息3.6菜单wParam参数的高字用于标识WM_COMMAND消息来自菜单操作还是来自快捷键操作,如果来自快捷键操作那么高字值为1,如果来自菜单操作,那么高字值为0。wmId=LOWORD(wParam);wmEvent=HIWORD(wParam);第3章Windows消息3.7定时器在Windows系统里可以把定时器看作是一种输入设备。它每经过一个指定的时间间隔就通知应用程序一次。这个通知是用WM_TIMER消息的形式完成的。3.7.1创建定时器SetTimer函数提供了定时功能。UINT_PTRSetTimer(HWNDhWnd,//窗口句柄UINT_PTRnIDEvent,//定时器ID,多个定时器时,可以通过该ID判断是哪个定时器UINTuElapse,//时间间隔,单位为毫秒TIMERPROClpTimerFunc//回调函数);第3章Windows消息3.7定时器当程序不再使用定时器时,要调用KillTimer函数来停止定时器消息。KillTimer会清除消息队列中尚未被处理的WM_TIMER消息,从而使程序在调用KillTimer之后就不会再接收到WM_TIMER消息。KillTimer函数用来关闭计时器。BOOLKillTimer(HWNDhWnd,//窗口的句柄UINT_PTRuIDEvent//定时器的事件ID);SetTimer(hWnd,1,300,NULL);KillTimer(hWnd,1);第3章Windows消息3.7定时器3.7.2定时器的两种用法使用WM_TIMER消息,是定时器最简单也是最方便的用法。SetTimer(hWnd,1,100,NULL);第一个参数是窗口的句柄,不能为空,第二个参数是事件号,不能为0,第三个是时间是一个UINT类型数据,第四个参数必须为空(使用WM_TIMER消息)。WM_TIMER消息方式第3章Windows消息3.7定时器如果有多个Timer。wParam参数指明了Timer的事件ID。如下代码创建了两个Timer,事件ID分别是1,2。SetTimer(hWnd,1,100,NULL);SetTimer(hWnd,2,200,NULL);Timer1每隔100毫秒发一次WM_TIMER消息,Timer2每隔200毫秒发一次WM_TIMER消息。caseWM_TIMER:{OutputDebugStr(_T(触发Timer消息));}break;caseWM_TIMER:{switch(wParam){case1:{OutputDebugStr(_T(触发Timer1消息));}break;case2:{OutputDebugStr(_T(触发Timer2消息));}break;}}第3章Windows消息3.7定时器在Windows过程处理函数中可以对两个Timer做不同的处理。回调函数方式第3章Windows消息3.7定时器使用该方式,开发者必须为每一个Timer提供一个回调函数,当时间周期到达的时候,系统就会通过回调函数对Timer事件进行响应。VOIDCALLBACKTimerProc(HWNDhwnd,UINTmessage,UINTiTimerID,DWORDdwTime){//处理WM_TIMER消息OutputDebugStr(_T(回调函数方式使用Timer));}SetTimer(hwnd,3,iMsecInterval,TimerProc);第3章Windows消息3.8滚动条3.8.1如何创建带滚动条的窗口Windows窗口有水平滚动条(HscrollBar)和垂直滚动条(VscrollBar)两种形式。滚动箭头滚动框给窗口添加滚动条很方便,只需要在创建窗口的CreateWindow函数中设置dwStyle参数的值。第3章Windows消息3.8滚动条设置dwStyle参数为WS_VSCROLL可以为窗口添加垂直滚动条设置dwStyle参数为WS_HSCROLL可以为窗口添加水平滚动条设置dwStyle参数为WS_VSCROLL|WS_HSCROLL,那么将同时在窗口中添加垂直和水平滚动条。VOIDCALLBACKTimerProc(HWNDhwnd,UINTmessage,UINTiTimerID,DWORDdwTime){//处理WM_TIMER消息OutputDebugStr(_T(回调函数方式使用Timer));}第3章Windows消息3.8滚动条创建垂直滚动条窗口创建了滚动条之后,还可以通过SetScrollInfo函数设置滚动条的范围、位置以及页面大小等初始值。intSetScrollInfo(HWNDhWnd;intfnBar,LPSCROLLINFOlpsi,BOOLfRedraw);第3章Windows消息3.8滚动条第一个参数是窗口的句柄。第二个参数是滚动条类型。第三个参数是一个指向SCROLLINFO类型变量的指针。最后一个参数是一个BOOL型变量,表示滚动窗口后是否刷新窗口。第3章Windows消息3.8滚动条typedefstructtagSCROLLINFO{UINTcbSize;UINTfMask;intnMin;intnMax;UINTnPage;intnPos;intnTrackPos;}SCROLLINFO,FAR*LPSCROLLINFO;nMin参数表示滚动范围的最小值;nMax参数表示滚动范围的最大值;nPos参数指定上述范围内的当前位置;nTrackPos参数表示当前正在滚动到的位置;nPage参数表示设定滑块的尺寸。fMask参数使用下列标志中的一个或多个。SIF_DISABLENOSCROLL使滚动条不可用。SIF_PAGE表示nPage保存有页面尺寸。SIF_POS表示保存滚动条位置。SIF_RANGE表示nMin和nMax保存有该滚动条范围。SIF_ALL表示这几种的组合SIF_RANGE|SIF_PAGE|SIF_POS|SIF_TRACKPOS。第3章Windows消息3.8滚动条SCROLLINFOscrlinfo;scrlinfo.cbSize=sizeof(scrlinfo);scrlinfo.fMask=SIF_PAGE|SIF_RANGE;scrlinfo.nMax=1000scrlinfo.nMin=0;scrlinfo.nPage=500scrlinfo.nPos=0;SetScrollInfo(hWnd,SB_VERT,&scrlinfo,TURE);第3章Windows消息3.8滚动条3.8.2如何响应滚动消息用户操作滚动条时,将会产生滚动条事件,并发送给滚动条对应的窗口。水平滚动条将产生WM_HSCROLL消息,垂直滚动条将产生WM_VSROLL消息。在滚动条消息对应的消息变量中,wParam参数记录滚动条事件的类型事件代码意义SB_LINEUP滚动条顶部的箭头被单击SB_LINEDOWN滚动条底部的箭头被单击SB_PAGEUP顶部箭头和滚动条滑块间的滚动区被单击SB_PAGEDOWN底部箭头和滚动条滑块间的滚动区被单击SB_THUMBTRACK滚动条拖动至某一位置SB_THUMBPOSITION拖动后并释放该滚动条滑块SB_ENDSCROLL滚动条拖动完成第3章Windows消息3.8滚动条caseWM_VSCROLL:{intnScrollCode=LOWORD(wParam);//!得到滚动事件IDintnPos=HIWORD(wParam);//!滚动位置switch(LOWORD(wParam)){caseSB_LINEUP:break;caseSB_LINEDOWN:break;}break;第3章Windows消息本章介绍了实现菜单消息的用法,菜单的响应,定时器的使用,滚动条的使用。加载菜单的方法有在窗口类中加载菜单,在创建窗口时加载菜单,动态加载菜单3种。所有菜单引发的窗口消息都是WM_COMMAND消息。使用函数SetTimer,函数KillTimer开启
本文标题:L17-18 Windows消息
链接地址:https://www.777doc.com/doc-3670710 .html