Frage

Bilden Sie das, was ich bisher in meinem Programm getan habe, es scheint, dass der einzige Weg, etwas auf eine Winform zu ziehen, über System.Windows.Forms.PainteventArgs besteht. Was ist, wenn Sie keinen Zugriff auf diese Argumente oder diesen Namespace haben und nur Zugriff auf die Winform haben?

Danke im Voraus.

War es hilfreich?

Lösung

Wenn Sie auf das Formular (oder eine andere Kontrolle) außerhalb der zeichnen möchten Paint Event muss man das bekommen Graphics Objekt für diese Kontrolle. Dann können Sie den Inhalt Ihres Herzens malen. Beachten Sie jedoch, dass das nächste Mal, wenn eine Farbnachricht kommt, wahrscheinlich gelöscht wird.

Auf das Formular zeichnen:

using (Graphics g = this.CreateGraphics())
{
    // do all your drawing here
}

Andere Tipps

PainteventArgs ist eine Klasse in dem System.Windows.forms Namespace. Wenn Sie mit Formularen arbeiten, bedeutet dies, dass Sie Zugriff auf den Namespace und die Klasse haben, aber Sie haben möglicherweise keinen Zugriff auf den Formular des Formulars, auf den Sie versuchen, ...

Auch wenn Sie keinen Zugriff auf den Quellcode des Formulars haben, ist das Lack -Ereignis öffentlich und Sie können einen Handler von Code außerhalb des Formulars registrieren. (Ich vermute, das ist Ihr Problem.)

Sehen Sie sich diese einfache Beispielklasse an, die einen Verweis auf eine Form hat, registriert mit dem Farbhandler und macht dann eine beliebige Zeichnung.

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication1 {
    class Painter {
        public Painter(Form form) {
            form.Paint += new PaintEventHandler(form_Paint);
        }

        void form_Paint(object sender, PaintEventArgs e) {
            e.Graphics.DrawLine(Pens.Black, 0, 0, 20, 20);
        }
    }
}

Das wichtige Konzept in diesem Snippet ist, dass Sie sich bei einem Verweis auf ein Formular (oder ein beliebiges Kontrollobjekt) mit dem Lackierereignis registrieren können, das automatisch aufgerufen wird, wenn die Steuerung neu gestrichen werden muss (und Sie können alles zeichnen, was Sie möchten auf diese Kontrolle.)

Im Snippet habe ich das Formular im Konstruktor übergeben und mich bei dem Farbereignis dort registriert, aber das war nur für ein kurzes Beispiel. Die Struktur Ihres Codes ist unterschiedlich, aber ... Sie haben ein Formular und es wird einen Initialisierungsschritt geben, in dem Sie sich für das Ereignis registrieren und dann eine Methode erstellen, die Ihr Gemälde ausführt.

Sie können andere Möglichkeiten zeichnen, indem Sie Ihr eigenes Grafikobjekt erstellen und entsorgen, aber dies ist nicht die bevorzugte Methode. Zum einen werden Sie nicht benachrichtigt, wenn Sie das Fenster neu zeichnen müssen, und müssten andere Mechanismen zum Neuzuziehen erstellen, z. B. einen Timer (als sehr einfaches und hässliches Beispiel), und Sie müssten das Grafikobjekt selbst verwalten.

Du erhalten Zugang zu ihnen, indem er die abonniert Control.Paint Ereignis, und Sie führen Ihre gesamte Zeichnung innerhalb des von Ihnen abonnierten Event -Handlers aus. Das wird mit den Relevanten versehen PaintEventArgs.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top