rectangles pointillées apparaissent solides lors de l'expansion fenêtre Winform
Question
Je rencontre un problème avec GDI + en rectangles pointillés peinture sur mesure.
La partie verticale de rectangles en pointillés apparaissent sous forme de lignes continues solides, lorsque la taille de la fenêtre est augmentée ou lors du défilement vers le haut / vers le bas. Déplacer la souris résultats plus rapides en moins en moins de sections solides. Curieusement les lignes horizontales ne présentent pas ce comportement et apparaissent comme prévu.
Jusqu'à présent, deux solutions non optimales ont été mis à ResizeRedraw = true
ou appeler Invalidate()
pendant OnResize()
et OnScroll()
. Je voudrais d'éviter bien sûr ce que ce que je dessine vraiment est plus complexe et ces appels lents détruisent l'expérience fluide. J'ai aussi essayé que la zone invalidant récemment montré sans succès - seulement Invalider complet semble fonctionner
Les pointeurs sur la façon de nous en sortir?
Code de démonstration:
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);
}
}
}
}
}
La solution
Je pense qu'il ya deux problèmes: il semble y avoir une zone au bord de la fenêtre où les rectangles ne sont pas dessinés correctement; et vous dessinez les rectangles sur l'autre, de sorte que le fringant ne fonctionnera pas correctement.
Remplacez votre boucle OnPaint ce qui suit:
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);
}