Frage

ich habe ein Problem mit GDI +, während benutzerdefinierte Malerei Rechtecke gestrichelte.

Der vertikale Abschnitt der gestrichelten Rechtecke erscheinen, als Feststoff, kontinuierliche Linien, wenn die Fenstergröße erhöht oder beim Scrollen nach oben / unten. Bewegen Sie die Maus schnelle Ergebnisse in immer weniger festen Abschnitten. Merkwürdiger die horizontalen Linien dieses Verhalten nicht zeigen und wie erwartet erscheinen.

Bisher zwei nicht-optimale Lösungen wurden ResizeRedraw = true während Invalidate() und OnResize() einzustellen OnScroll() oder anzurufen. Ich würde natürlich gerne, dies zu vermeiden wie das, was ich wirklich Zeichnung ist komplexer und diese langsamen Anrufe zerstören die Flüssigkeit Erfahrung. Ich habe auch versucht, nur die neu dargestellten Bereich ohne Erfolg ungültig zu machen - nur ein voll Invalidate scheint zu funktionieren

.

Alle Hinweise, wie dies zu trainieren?

Demo-Code:

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);
                }
            }
        }
    }
}
War es hilfreich?

Lösung

Ich denke, es gibt zwei Probleme: Es erscheint am Rande des Fensters ein Bereich, in dem Rechtecke nicht korrekt gezogen werden; und Sie sind die Rechtecken übereinander zeichnen, so die schneidigen nicht richtig funktionieren.

Ersetzen Sie Ihre OnPaint Schleife mit den folgenden:

   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);
   }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top