Pergunta

Eu estou enfrentando um problema com GDI + enquanto costume pintar retângulos tracejadas.

A porção vertical de rectângulos a tracejado aparecem como sólidos, as linhas contínuas, quando o tamanho da janela é aumentada ou quando se deslocar para cima / para baixo. Movendo o mouse mais rápido resulta em menos e menos seções sólidos. Curiosamente as linhas horizontais não apresentam esse comportamento e aparecer como esperado.

Até agora duas soluções não ideais foram para set ResizeRedraw = true ou para Invalidate() chamada durante OnResize() e OnScroll(). Eu tinha de curso como para evitar este como o que eu estou realmente desenho é mais complexo e essas chamadas lentas destruir a experiência fluida. Eu também tentei invalidar apenas a área recém mostrado sem sucesso - apenas uma Invalidate cheia parece funcionar

.

Os ponteiros sobre como resolver isso?

código Demonstração:

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

Solução

Eu acho que existem dois problemas: parece haver uma área na borda da janela onde retângulos não são desenhadas corretamente; e você está desenhando os retângulos uns sobre os outros, de modo que o arrojado não funcionará corretamente.

Substitua seu loop OnPaint com o seguinte:

   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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top