一次发送获取多条 WM_PAINT 条消息

Getting several WM_PAINT message with one dispatch

我在 window 的消息处理程序中收到多个 WM_PAINT messages/events ,同时我调整它的大小,即使我只翻译+发送一条消息。

这正常吗?为什么会这样? (我希望每次发送都能收到一条 WM_PAINT 消息,而且不会超过)

Window循环:

while (true) // only for the example
{
    std::cout << "Checking events\n";

    MSG winEvent = {};
    while (PeekMessage(&winEvent, NULL, 0, 0, PM_REMOVE))
    {
        std::cout << "ev\n";
        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 EVENT\n";
        return DefWindowProc(_hwnd, _uMsg, _wParam, _lParam);
    }

    return DefWindowProc(_hwnd, _uMsg, _wParam, _lParam);
}

控制台输出:

Checking events
ev
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT

答案很简单:

开始调整大小会进入一个嵌套的消息循环,您没有使用它。

因此,您收到的已发布消息是您自己编写的外循环所不知道的。

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