无效与更新

时间:2010-02-18 05:55:32

标签: c# winforms drag-and-drop invalidation

我的代码可以让我在winforms中拖动一个无边界形式,我已经使用了几个月了,这非常有效。

但是当我第一次获得代码时,他们在Form的this.Invalidate();事件中使用了MouseMove,而且在拖动时,Form闪烁了一点并且速度很慢。因此,我在Invalidate()事件中将Update()替换为MouseMove,令我惊讶的是,现在可以非常顺利地拖动表单并且不会闪烁任何内容。

有人可以向我解释为什么Update会使代码比Invalidate更好用,即使Invalidate听起来像是正确的使用吗?

谢谢:)

P.S。如果我添加代码可能会有更多帮助...现在添加它。

编辑 - 这是代码:


private void titlebar_MouseDown(object sender, MouseEventArgs e)
{
    this.IsMouseDown = true;

    this.LastCursorPosition = new Point(e.X, e.Y);

    if (this.BackColor == Color.White)
    {
        this.BackColor = Color.GhostWhite;
        tbox.BackColor = Color.GhostWhite;
        tbox.ForeColor = Color.Black;
    }
    else
    {
        this.BackColor = Color.FromArgb(20, 20, 20);
        tbox.BackColor = Color.FromArgb(20, 20, 20);
        tbox.ForeColor = Color.White;
    }
}

private void titlebar_MouseMove(object sender, MouseEventArgs e)
{
    if (this.IsMouseDown == true)
    {
        //Move the form
        this.Location = new Point(this.Left - (this.LastCursorPosition.X - e.X), this.Top - (this.LastCursorPosition.Y - e.Y));

        // Update works better than Invalidate();.
        Update();
    }
}

private void titlebar_MouseUp(object sender, MouseEventArgs e)
{
    this.IsMouseDown = false;
    this.BackColor = fc;
    tbox.BackColor = fc;
}

2 个答案:

答案 0 :(得分:38)

Invalidate()只需区域添加到控件的更新区域。下次收到WM_PAINT时,您宣告无效的区域加上任何其他无效区域将被标记为绘画。调用RedrawWindow()时,通常会将WM_PAINT消息发布到应用程序队列。系统可以自由地做它想要的东西,通常是更紧迫的业务,并尽可能地绘画。

如果您致电Update(),则会获得GDI +的UpdateWindow(),但不会标记要重新绘制的区域,而是将WM_PAINT直接推送到WNDPROC(),绕过应用程序队列。

如果您需要立即刷新控件,请使用Refresh(),这会使该区域无效,然后立即调用Update()

答案 1 :(得分:12)

Invalidate将窗口标记为需要刷新(在某些时候)。更新在那里,如果我没记错的话

这是一个link来解释差异比我能够

更好