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);
                }
            }
        }
    }
}
Était-ce utile?

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);
   }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top