2

我正在控件中的 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 次,如果我允许基地处理它,它会被调用一次。我遗漏了什么?

4

1 回答 1

4

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

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

于 2013-03-10T03:46:09.183 回答