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);
                }
            }
        }
    }
}
¿Fue útil?

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);
   }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top