如何正确处理WM_PAINT,不断重新绘制

时间:2013-03-10 03:26:51

标签: c#

我在控件中的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次,如果我允许基地处理它,它被调用一次。我要离开的是什么?

1 个答案:

答案 0 :(得分:3)

这是因为你没有告诉Windows“脏矩形”不再是脏的并且被涂上了。所以它不断生成WM_PAINT消息。

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