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()
.