c# - Invalidar vs actualizar
winforms drag-and-drop (2)
Tengo un código que permite arrastrar una forma sin bordes en formularios de Windows que he estado usando durante varios meses, lo que funciona extremadamente bien.
Pero cuando me dieron el código por primera vez, utilizaron this.Invalidate();
en el evento MouseMove
del formulario, y el formulario parpadeaba un poco y era lento cuando se arrastraba. Por lo tanto, reemplacé Invalidate()
con Update()
en el evento MouseMove
y, para mi sorpresa, el Formulario ahora se puede arrastrar muy suavemente y no tiene parpadeo.
¿Alguien puede explicarme por qué Update hace que el código funcione mejor que Invalidate, incluso cuando Invalidate suena como si fuera el correcto usar?
Gracias :)
PD: Tal vez ayudaría más si agregara el código ... Agregándolo ahora.
Editar - Aquí está el código:
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 marca la ventana como una necesidad de actualización (en algún momento). La actualización lo hace allí y luego si no recuerdo mal.
Aquí hay un link para explicar la diferencia mejor de lo que podría
Invalidate()
simplemente agrega una región a la región de actualización del control. La próxima vez que se reciba WM_PAINT, el área que invalidó y cualquier otra región invalidada se marcarán para pintar. Cuando se llama a RedrawWindow()
, normalmente se publicará un mensaje WM_PAINT en la cola de la aplicación. El sistema es libre de hacer lo que quiera con eso, generalmente un negocio más apremiante, y pintar cuando sea posible.
Si llama a Update()
, obtendrá UpdateWindow()
GDI + que no marcará una región para volver a pintar, pero empuja WM_PAINT
directamente a WNDPROC()
, sin pasar por la cola de la aplicación.
Si necesita una actualización inmediata de un control, use Refresh()
, que invalida la región e inmediatamente llama a Update()
.