2009-04-17 5 views
0

Je rencontre un problème avec GDI + lors de la personnalisation de rectangles en pointillés.Les rectangles en pointillés semblent solides lors de l'expansion de la fenêtre Winform

La partie verticale des rectangles en pointillés apparaît sous la forme de lignes continues et continues lorsque la taille de la fenêtre est augmentée ou lorsque vous faites défiler vers le haut ou vers le bas. Déplacer la souris plus rapidement entraîne de 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 bien sûr éviter cela car ce que je dessine vraiment est plus complexe et ces appels lents détruisent l'expérience fluide. J'ai également essayé d'invalider seulement la zone nouvellement montrée en vain - seulement un Invalidate complet semble fonctionner.

Des pointeurs sur la façon de résoudre ce problème?

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); 
       } 
      } 
     } 
    } 
} 

Répondre

1

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 les uns sur les autres, de sorte que le tiraillement ne fonctionnera pas correctement.

Remplacez votre boucle de 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); 
    } 
+0

Merci, qui a fait l'affaire Mark. Les deux problèmes mentionnés semblent être vrais. La ligne continue apparaît lorsque vous dessinez un seul rectangle sur le bord gauche, mais pas sur le côté droit. De plus, toutes les sections verticales découvertes affichent également ce comportement (seule la ligne droite du rectangle le plus à droite semble correcte). Étant donné que mon représentant est trop faible pour modifier un message, quelqu'un peut-il modifier la condition dans la première boucle pour 'y

Questions connexes