Подтвердить что ты не робот

Invalidate vs Update

У меня есть код, который позволяет перетаскивать форму без полей в 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;
}
4b9b3361

Ответ 1

Недействительный отметит окно, которое необходимо обновить (в какой-то момент). Обновление происходит там, а затем, если я правильно помню

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

Ответ 2

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

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

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