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);
                }
            }
        }
    }
}
È stato utile?

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);
   }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top