У меня есть код, который позволяет быть, перетаскивают вокруг безграничной формы в 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;
}
Invalidate отмечает окно как требующее обновления (в какой-то момент). Update делает это там и тогда, если я правильно помню
Вот ссылка, объясняющая разницу лучше, чем я смогу
Invalidate ()
просто добавляет область к области обновления элемента управления. В следующий раз, когда будет получен WM_PAINT, область, которую вы сделали недействительной, плюс любые другие недействительные области помечаются для рисования. Когда вызывается RedrawWindow ()
, это обычно помещает сообщение WM_PAINT в очередь приложения. Система вольна делать с этим все, что хочет, обычно с более неотложными делами, и рисовать, когда может.
Если вы вызовете Update ()
, вы получите GDI + UpdateWindow ()
, который не помечает область для перерисовки, а отправляет WM_PAINT
непосредственно в WNDPROC ()
, минуя очередь приложений.
Если вам требуется немедленное обновление элемента управления, используйте Refresh ()
, который делает область недействительной, а затем немедленно вызывает Update ()
.