【问题标题】:Recieving "WM_PAINT" message for no reason until I repaint the window在我重新绘制窗口之前无缘无故收到 \"WM_PAINT\" 消息
【发布时间】:2022-11-12 05:23:50
【问题描述】:

我在我的主窗口过程中写了这段代码

case WM_PAINT:
    {
        if (check > 6)
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd, &ps);
            FillRect(hdc, &ps.rcPaint, (HBRUSH) COLOR_GRAYTEXT);
            EndPaint(hwnd, &ps);
        }

        check++;
        printf("%d\n", check);
            break;
    }

我意识到控制台输出是 1 2 3 4 5 6 7 8,这意味着我收到了 WM_PAINT 消息,直到重新绘制窗口。这是为什么?

【问题讨论】:

  • 这就是系统的工作方式。每当您的线程空闲并且需要完成绘画时,就会生成 WM_PAINT 消息。一如既往,Raymond has more details
  • 感谢@JonathanPotter 的有用评论。这个 Resmond Chen 小伙子无处不在

标签: winapi


【解决方案1】:

处理WM_PAINT 时不能跳过调用BeginPaint()/EndPaint()(除非你手动调用ValidateRect())。每当窗口无效并且具有需要在屏幕上绘制的区域时都会触发该消息。 BeginPaint() 验证窗口,因此它不会触发进一步的 WM_PAINT 消息,直到它再次失效。因此,如果您跳过调用BeginPaint(),窗口将保持无效,触发无穷无尽的WM_PAINT 消息,直到窗口最终被验证。

【讨论】:

    猜你喜欢
    • 2020-10-22
    • 2010-11-01
    • 2018-01-28
    • 1970-01-01
    • 2014-09-09
    • 2022-01-15
    • 2021-11-08
    • 1970-01-01
    • 2016-03-14
    相关资源
    最近更新 更多