rettangoli tratteggiati appaiono solidi quando la finestra Winform espansione
Domanda
Ho riscontrato un problema con GDI +, mentre la pittura personalizzato tratteggiata rettangoli.
La porzione verticale di rettangoli tratteggiati appaiono come solidi, linee continue quando la dimensione della finestra viene aumentata o quando lo scorrimento su / giù. Spostare il mouse risultati più veloci nei sempre meno sezioni solide. Curiosamente le linee orizzontali non presentano questo comportamento e vengono visualizzati come previsto.
Finora due soluzioni non ottimali sono stati per impostare ResizeRedraw = true
o chiamare Invalidate()
durante OnResize()
e OnScroll()
. Mi piacerebbe, naturalmente, per evitare questo, come quello che sto veramente disegno è più complesso e queste chiamate lenti distruggono l'esperienza fluida. Ho anche provato invalidare solo la zona di recente mostrato senza alcun risultato - solo Invalidate piena sembra funzionare
Le eventuali indicazioni su come lavorare questo fuori?
Codice Demo:
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);
}
}
}
}
}
Soluzione
Penso che ci siano due problemi: sembra che vi sia una zona a bordo della finestra in cui rettangoli non sono utilizzate in modo corretto; e si sta disegnando rettangoli oltre l'un l'altro, in modo che il focoso non funzionerà correttamente.
Sostituire il ciclo OnPaint con il seguente:
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);
}