Делайте недействительным по сравнению с обновлением

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

Но когда мне сначала дали код, они использовали this.Invalidate(); в MouseMove событие Формы и Формы мерцало немного и было медленным при перетаскивании вокруг. Так, я заменил Invalidate() с Update() в MouseMove событие и, к моему удивлению, Форма может теперь быть перетащена очень гладко и не имеет никакого мерцания вообще.

Кто-то может объяснить мне, почему Обновление заставляет код работать лучше, чем Делают недействительным, даже когда Делают недействительным, кажется, что это - правильное для использования?

Спасибо :)

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;
}
22
задан Yves M. 21 November 2014 в 16:04
поделиться

2 ответа

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

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

13
ответ дан 29 November 2019 в 04:08
поделиться

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

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

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

39
ответ дан 29 November 2019 в 04:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: