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_LPARAMGET_Y_LPARAM宏。

本文固定链接:http://www.oxox.work/web/directx11/message-handler/ | 虚幻大学

 

 

0 0
原创粉丝点击