Invalidate vs Update

у меня есть код, который позволяет перетаскивать форму без границ в winforms, которую я использую уже несколько месяцев, что работает очень хорошо.

но когда мне впервые дали код, они использовали this.Invalidate(); на MouseMove событие формы, и форма немного мерцала и была медленной при перетаскивании. Итак, Я заменил Invalidate() С Update() на MouseMove событие и, к моему удивлению, форма теперь может быть перетащена очень плавно и не мерцает Любой.

может ли кто-нибудь объяснить мне, почему обновление делает код лучше, чем недействительным, даже если 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 ответов


Invalidate отмечает окно как нуждающееся в обновлении (в какой-то момент). Обновление делает это там, а затем, если я правильно помню

здесь ссылке объяснить разницу лучше, чем я был бы в состоянии


Invalidate() просто добавляет область в область обновления элемента управления. При следующем получении WM_PAINT область, признанная недействительной, а также любые другие признанные недействительными области помечаются для рисования. Когда , который обычно отправляет сообщение WM_PAINT в очередь приложений. Система вольна делать с этим, что хочет, обычно более срочное дело, и рисовать, когда может.

если вы называете Update(), вы получаете GDI+ ' s UpdateWindow() который не будет отмечать a область для перекраски, но толкает WM_PAINT на WNDPROC(), минуя очередь приложения.

если вы нужно немедленное обновление элемента управления, используйте Refresh(), что делает регион недействительным, а затем немедленно вызывает Update().