4.4.5 The Message Handler
来源:互联网 发布:dota2数据查询app 编辑:程序博客网 时间:2024/06/08 12:33
我们最低限度实现了我们的应用程序框架窗口过程。一般情况下,我们对Win32的消息不做过多的工作。事实上,我们的应用程序代码的核心在没有窗口消息存在期间被执行。不过,也有我们确实需要处理一些重要的消息。然而,因为窗口过程有很多消息,我们并没有涉及所有的代码;相反,我们只是说明我们处理的每个消息背后的动机。我们鼓励读者下载源代码文件,花一些时间去熟悉的应用程序框架代码,这是这本书每个样本的基础。
我们处理的第一个消息是WM_ACTIVATE消息。当应用程序被激活或停用时此消息被发送。我们像这样实现它:
case WM_ACTIVATE:if(LOWORD(wParam) == WA_INACTIVE){mAppPaused = true;mTimer.Stop();}else{mAppPaused = false;mTimer.Start();}return 0;
正如你所看到的,当我们的应用程序暂停时,我们设置了数据成员mAppPaused为true,当我们
应用程序被激活,我们设置了数据成员mAppPaused为false。此外,当应用程序暂停时,我们停止了计时器,然后重新开始计时,一旦应用程序再次激活。如果我们回头看D3DApp::Run的实现
(§4.3.3),我们发现,如果我们的应用程序被暂停,我们不更新我们的应用程序代码,而是释放一些CPU周期到操作系统;以这种方式,我们的应用程序不占用CPU周期。
接下来我们处理的是WM_SIZE消息。回想一下,当窗口大小改变时此消息被调用。处理此消息主要的原因是我们想要的后台缓冲和深度/模板尺寸与客户端区域的矩形的尺寸相匹配(所以没有发生拉伸)。因此,当一个窗口大小的时候,我们要调整缓冲区大小。调整缓冲区的代码在D3DApp:: onResize实现。如前所述,后台缓冲区可以通过IDXGISwapChain :: ResizeBuffers函数的调用被调整大小。深度/模板缓冲区需要销毁然后重新创建。此外,渲染目标和深度/模板缓冲需要重新创建。如果用户拖动调整大小,我们必须要小心,因为拖动调整大小酒吧将连WM_SIZE消息,我们不希望继续调整缓冲区。因此,如果我们确定该用户是通过拖动调整,我们实际上什么都不做(除了暂停应用程序),直到用户完成拖动调整大小。我们可以通过处理WM_EXITSIZEMOVE信息做到这一点。此消息被发送时,用户完成了调整大小。
// WM_ENTERSIZEMOVE is sent when the user grabs the resize bars.case WM_ENTERSIZEMOVE:mAppPaused = true;mResizing = true;mTimer.Stop();return 0;// WM_EXITSIZEMOVE is sent when the user releases the resize bars.// Here we reset everything based on the new window dimensions.case WM_EXITSIZEMOVE:mAppPaused = false;mResizing = false;mTimer.Start();OnResize();return 0;
接下来的三个消息的代码如下:
// WM_DESTROY is sent when the window is being destroyed.case WM_DESTROY:PostQuitMessage(0);return 0;// The WM_MENUCHAR message is sent when a menu is active and the user presses// a key that does not correspond to any mnemonic or accelerator key.case WM_MENUCHAR:// Don't beep when we alt-enter.return MAKELRESULT(0, MNC_CLOSE);// Catch this message to prevent the window from becoming too small.case WM_GETMINMAXINFO:((MINMAXINFO*)lParam)->ptMinTrackSize.x = 200;((MINMAXINFO*)lParam)->ptMinTrackSize.y = 200;return 0;
最后,为了支持我们的鼠标输入的虚函数,我们处理下面的鼠标消息:
case WM_LBUTTONDOWN:case WM_MBUTTONDOWN:case WM_RBUTTONDOWN:OnMouseDown(wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));return 0;case WM_LBUTTONUP:case WM_MBUTTONUP:case WM_RBUTTONUP:OnMouseUp(wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));return 0;case WM_MOUSEMOVE:OnMouseMove(wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));return 0;
我们必须#include<Windowsx.h>,当使用GET_X_LPARAM和GET_Y_LPARAM宏。
本文固定链接:http://www.oxox.work/web/directx11/message-handler/ | 虚幻大学
- 4.4.5 The Message Handler
- Handler Message
- Message、Handler
- handler+message
- Looper,Handler,Message,MessageQueue
- Message,MessageQueue,Looper,Handler
- Looper Handler Message
- Handler Message相关说明
- handler,message,Looper
- handler和message传值两例
- 通过handler与message
- Looper,Handler,Message
- Handler Message Looper陈述
- Handler,Looper,Message
- Android Handler Message总结
- Android之Handler & Message
- Handler Runnable Message
- Handler,Message,Runnable
- 关于Xutils网络访问
- git使用简介
- redis入门
- 零基础用react-native开发android app
- LSD直线检测
- 4.4.5 The Message Handler
- 简单Dream-查找oracle官方文档的方法
- 数据表编辑类型第二讲——单项选择
- Data Structure(1)---线性表
- 游戏设计的236个技巧:游戏机制、关卡设计和镜头窍门——互动出版网
- 学生围成圈分糖果问题(Problem ID:1034)
- 个人笔记 js 07 js向select里添加option
- leetcode 233: Number of Digit One
- 【工具】用Java Swing创建一个Cocos2dX创建工程工具