Invalidate vs Update - PullRequest
       12

Invalidate vs Update

22 голосов
/ 18 февраля 2010

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

Но когда мне впервые дали код, они использовали this.Invalidate(); в событии MouseMove формы, и форма немного мерцала и была медленной при перетаскивании. Итак, я заменил 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 ]

39 голосов
/ 18 февраля 2010

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

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

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

12 голосов
/ 18 февраля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...