Discontinuas rectángulos aparecen sólida cuando se expande la ventana Winform
Pregunta
Estoy experimentando un problema con GDI +, mientras que la pintura de encargo precipitó rectángulos.
La parte vertical de rectángulos de trazos aparecen como líneas sólidas, continuas cuando el tamaño de la ventana se aumenta o cuando se desplaza hacia arriba / abajo. Mover el ratón más rápidos resultados en las secciones sólidas cada vez menos. Curiosamente las líneas horizontales no presentan este comportamiento y aparecen como se esperaba.
Hasta ahora dos soluciones no óptimas han sido establecer ResizeRedraw = true
o llamar Invalidate()
durante OnResize()
y OnScroll()
. Yo, por supuesto gustaría evitar esto como lo que realmente estoy dibujo es más complejo y estas llamadas lentas destruyen la experiencia fluida. También he intentado invalidar sólo el área recién se muestra en vano - sólo Invalidate completa parece funcionar
Cualquier punteros sobre cómo resolver esto?
código de demostración:
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
public class Form1 : Form
{
static void Main()
{
Application.Run(new Form1());
}
public Form1()
{
this.ClientSize = new System.Drawing.Size(472, 349);
DoubleBuffered = true;
//ResizeRedraw = true;
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
int dimensions = 70;
using ( Pen pen = new Pen(Color.Gray) )
{
pen.DashStyle = DashStyle.Dash;
for ( int x = 0; x < 20; ++x )
{
for ( int y = 0; y < 20; ++y )
{
Rectangle rect = new Rectangle(x * dimensions, y * dimensions, dimensions, dimensions);
e.Graphics.DrawRectangle(pen, rect);
}
}
}
}
}
Solución
Creo que hay dos problemas: parece que hay un área en el borde de la ventana, donde los rectángulos no se dibujan correctamente; y que está dibujando los rectángulos más de uno al otro, por lo que el gallardo no funcionará correctamente.
Reemplazar el bucle OnPaint con lo siguiente:
for (int y = 0; y < Height; y += dimensions)
{
e.Graphics.DrawLine(pen, 0, y, Width, y);
}
for (int x = 0; x < Width; x += dimensions)
{
e.Graphics.DrawLine(pen, x, 0, x, Height);
}