retângulos tracejadas aparecem sólida quando expandindo janela Winform
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);
}
}
}
}
}
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);
}