用一个调度获取多个WM_PAINT消息



我在我的窗口的消息处理程序中得到几个WM_PAINT消息/事件,而我调整了它的大小,即使我只翻译+调度一条消息。

这正常吗?为什么会发生这种情况?(我期望每次调度得到一个WM_PAINT消息,并且永远不会超过这个)

窗口循环:

while (true) // only for the example
{
std::cout << "Checking eventsn";
MSG winEvent = {};
while (PeekMessage(&winEvent, NULL, 0, 0, PM_REMOVE))
{
std::cout << "evn";
TranslateMessage(&winEvent);
DispatchMessage(&winEvent);
}
}

消息处理函数:

LRESULT CALLBACK windowEvent(HWND _hwnd, UINT _uMsg, WPARAM _wParam, LPARAM _lParam)
{
switch (_uMsg)
{
// extra cases removed for the example
case WM_PAINT:
std::cout << "PAINT EVENTn";
return DefWindowProc(_hwnd, _uMsg, _wParam, _lParam);
}
return DefWindowProc(_hwnd, _uMsg, _wParam, _lParam);
}

控制台输出:

  • 在点击之前,许多"检查事件";和";ev"信息出现
  • 当第一次点击窗口边框时,"ev"出现
  • 按住左键,没有消息出现
  • 按住并拖动使窗口更大,更"PAINT event";信息出现
Checking events
ev
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT

答案很简单:

开始调整大小会进入一个嵌套的消息循环,这是您没有检测到的。

因此,你得到的消息是你自己编写的外循环所不知道的。

如果存在任何无效,则WM_PAINT消息通常是为空消息队列生成的,而不是发布,这不会改变任何相关内容。

相关内容

  • 没有找到相关文章