0
点赞
收藏
分享

微信扫一扫

4.4.5 The Message Handler

言午栩 2022-08-11 阅读 32


我们最低限度实现了我们的应用程序框架窗口过程。一般情况下,我们对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宏。


 

 

举报

相关推荐

0 条评论