Gewusst wie: Zeichnen von Bildern außerhalb des Bildschirms

Aktualisiert: November 2007

Sie können das Flackern beim Zeichnen von großen Bildern reduzieren, indem Sie das Bild mithilfe eines nicht mit dem Formular verknüpften Graphics-Objekts außerhalb des Bildschirms erstellen. Zeichnen Sie dann das Bild mit einem Graphics-Objekt des Formulars auf dem Bildschirm.

Beispiel

In diesem Beispiel wird die OnPaint-Methode überschrieben, um eine große Bitmap anhand eines von der Bitmap abgeleiteten Graphics-Objekts außerhalb des Bildschirms zu erstellen. Anschließend wird die Bitmap mithilfe des Graphics-Objekts, das von der Graphics-Eigenschaft von PaintEventArgs zurückgegeben wird, auf dem Bildschirm gezeichnet.

Nach dem Laden des Formulars kann es einige Sekunden dauern, bis das Bild angezeigt wird.

Protected Overrides Sub OnPaint(e As PaintEventArgs)

    Dim bmp As Bitmap
    Dim gOff As Graphics

    ' Create a bitmap the size of the form.
    bmp = New Bitmap(ClientRectangle.Width, ClientRectangle.Height)

    Dim BlueBrush As New SolidBrush(Color.Blue)
    Dim WhitePen As New Pen(Color.White, 3)

    ' Create a Graphics object that is not on the form.
    gOff = Graphics.FromImage(bmp)
    gOff.FillRectangle(new SolidBrush(color.red), 0, 0, _
        bmp.Width, bmp.Height)

    ' Draw a complex bitmap of 1000 random rectangles. It will take a few
    ' seconds to draw.
    Dim z As Integer
    For z = 1 To 1000

        ' Generate a random number with
        ' seeds from the system clock.
        Thread.Sleep(1)
        Dim rx As New Random()
        Thread.Sleep(1)
        Dim ry As New Random()

        ' Create rectangles in the inner area of the form.
        Dim rect As New Rectangle(rx.Next(10,200), ry.Next(10,200), 10, 10)
        gOff.DrawRectangle(WhitePen, rect)
        gOff.FillRectangle(BlueBrush, rect)
    Next z

    ' Use the Graphics object from 
    ' PaintEventArgs to draw the bitmap onto the screen.
    e.Graphics.DrawImage(bmp, 0, 0, ClientRectangle, GraphicsUnit.Pixel)

    gOff.Dispose()

End Sub
protected override void OnPaint(PaintEventArgs e)
{

    Bitmap bmp;
    Graphics gOff;

    // Create a bitmap the size of the form.
    bmp = new Bitmap(ClientRectangle.Width, ClientRectangle.Height);

    SolidBrush BlueBrush = new SolidBrush(Color.Blue);
    Pen WhitePen = new Pen(Color.White,3);

    // Create a Graphics object that is not on the form.
    gOff = Graphics.FromImage(bmp);
    gOff.FillRectangle(new SolidBrush(Color.Red), 0, 0, 
        bmp.Width, bmp.Height);

    // Draw a complex bitmap of 1000 random rectangles. It will take a few
    // seconds to draw.
    for (int z = 1; z <= 1000; z++)
    {
        // Generate a random number with
        // seeds from the system clock.
        Thread.Sleep(1);
        Random rx = new Random();
        Thread.Sleep(1);
        Random ry = new Random();

        // Create rectangles in the inner area of the form.
        Rectangle rect = new Rectangle(rx.Next(10,200), ry.Next(10,200),
            10, 10);
        gOff.DrawRectangle(WhitePen, rect);
        gOff.FillRectangle(BlueBrush, rect);
    }

    // Use the Graphics object from 
    // PaintEventArgs to draw the bitmap onto the screen.
    e.Graphics.DrawImage(bmp, 0, 0, ClientRectangle, GraphicsUnit.Pixel);
    gOff.Dispose();
}

Kompilieren des Codes

Für dieses Beispiel sind Verweise auf die folgenden Namespaces erforderlich:

Robuste Programmierung

Beachten Sie, dass das zum Zeichnen außerhalb des Bildschirms erstellte Graphics-Objekt anschließend verworfen werden sollte. Das Graphics-Objekt, das von der Graphics-Eigenschaft des PaintEventArgs-Objekts zurückgegeben wird, wird vom Garbage Collector zerstört und muss nicht explizit verworfen werden.

Siehe auch

Weitere Ressourcen

Grafik und Zeichnen in .NET Compact Framework