4.4.5 The Message Handler

我们最低限度实现了我们的应用程序框架窗口过程。一般情况下,我们对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
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虚坏叔叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值