【问题标题】:How to handle WM_PAINT properly, getting constant repainting如何正确处理 WM_PAINT,不断重绘
【发布时间】:2013-03-10 03:26:51
【问题描述】:

我正在控件中的 WndProc 覆盖中对 WM_PAINT 和 WM_ERASEBKGD 进行自定义处理。

protected override void WndProc(ref Message m)
{
    if (m.Msg == 0xF)
    {
        // [Draw using stored hDC]

        m.Result = (IntPtr)1;
    }
    else if (m.Msg == 0x14)
    {
        m.Result = (IntPtr)1;
    }
    else
        base.WndProc(ref m);
}

它工作得很好,只是它被不断地调用,大约每秒 300 次,如果我允许基地处理它,它会被调用一次。我遗漏了什么?

【问题讨论】:

  • 要告诉 Windowd 窗口已绘制,您必须调用 BeginPaint(标准方式)或 ValidateRect(如果您不使用标准绘制周期,看起来您没有使用,原因是没有解释)。

标签: c#


【解决方案1】:

发生这种情况是因为您没有告诉 Windows“脏矩形”不再脏并且已被绘制。所以它不断生成 WM_PAINT 消息。

这通常使用 BeginPaint/EndPaint() 来完成,由 .NET 中内置的默认消息处理程序调用。它调用了虚拟 OnPaint() 方法。覆盖它或处理 Paint 事件是推荐的方法。如果您出于某种原因不想使用它,那么您将不得不 pinvoke ValidateRect()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-14
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多