gpt4 book ai didi

c++ - 调整窗口大小时不断发送窗口消息 WM_SIZING

转载 作者:行者123 更新时间:2023-11-28 03:10:49 24 4
gpt4 key购买 nike

我制作小游戏时遇到了一些低优先级窗口消息的问题,这些消息不断地从系统发送并阻止运行游戏逻辑的代码。

我像这样创建我的消息循环:

bool Window::SystemRoutineAndCheckQuit() {
::MSG msg;
while( ::PeekMessage( &msg, nullptr, 0, 0, PM_REMOVE ) ) {
if( msg.message == WM_QUIT ) {
::UnregisterClass( registeredClassName, ::GetModuleHandle( nullptr ) );
DLOG( lg ) << "Exit from system loop" << DLOG_END;
return false;
}

::TranslateMessage( &msg );
::DispatchMessage( &msg );
}

return true;
}
//....
while( window.SystemRoutineAndCheckQuit() ) {
// do all render and logic
}

即在每一帧之前,我想处理来自窗口的所有消息,然后,当队列为空时执行所有逻辑。我注意到当窗口调整大小时我一次又一次地收到相同的消息 WM_SIZING 并且当鼠标按钮仍然按下时队列永远不会为空(即使窗口大小没有从以前的调用改变我收到具有相同窗口坐标的消息)。所以它会阻止执行我的代码。

是否有任何其他消息可以使 Windows 消息队列不为空,以及在没有低优先级(如 WM_SIZING)的情况下处理所有消息的最佳方法是什么?

我在 Windows 8 上测试它。

PS:我需要调整窗口大小,所以我不想通过更改样式来禁止它。

编辑: 对不正确的描述问题深表歉意,但发现了真正发生的事情(以及为什么我之前尝试通过限制已处理消息的数量或在两次收到相同消息时中断消息处理来修复它按顺序不会成功)。从 PeekMessage 我得到消息 WM_NCLBUTTONDOWN 并且在此消息之后程序不从::DispatchMessage 返回并阻止继续执行线程直到鼠标被释放。当在 DispatchMessage 中编程时,我的处理程序重复获得 WM_SIZING 或 WM_MOVING(独立地从消息处理函数返回什么(DefWindowProc 的结果,TRUE(消息已处理)或 0)。

最佳答案

您可以在每帧之前只处理 N 条消息。其中 N 是您设置在 1-10 之间的限制。这样您就可以处理合理数量的事件,然后进入您的实际游戏逻辑。

可以想象,Windows 可能只是在队列为空时不断生成“窗口大小调整”消息,以确保应用程序知道窗口正在调整大小。

(也许 MS 认为应用程序可能不知道,也许用户无能为力..所以 MS 想敲定那条消息。)

关于c++ - 调整窗口大小时不断发送窗口消息 WM_SIZING,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18554407/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com