一次发送获取多个 WM_PAINT 消息

问题描述

当我调整窗口大小时,我在窗口的消息处理程序中收到了几个 WM_PAINT 消息/事件,即使我只翻译+发送一条消息。

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

窗口循环:

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

    MSG winEvent = {};
    while (PeekMessage(&winEvent,NULL,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,_lParam);
}

控制台输出

  • 点击之前,会出现许多“正在检查事件”和“ev”消息
  • 第一次点击窗口边框时,出现“ev”
  • 按住左键不显示任何消息
  • 按住并拖动使窗口变大时,会出现更多“PAINT EVENT”消息
Checking events
ev
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT
PAINT EVENT

解决方法

答案很简单:

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

因此,您会收到发布的消息,而您自己编写的外部循环却从未知道。

如果有任何失效,通常会为空消息队列生成 var html = HtmlService.createTemplateFromFile('Index') html.data = data html = html.evaluate(); 消息,而不是发布,不会更改任何相关内容。