Paint-Event durchreichen

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Paint-Event durchreichen

    Auf meinem Form habe ich ein Usercontrol und einen Button. Das Usercontrol beinhaltet eine PictureBox. Jetzt klicke ich auf den Button:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Me.Usercontrol1.Invalidate()
    3. End Sub

    und löse so mein Paint-Event aus, in dem ich der Einfachheit halber mal nur ein Rechteck zeichnen lasse.

    VB.NET-Quellcode

    1. Private Sub Usercontrol1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Usercontrol1.Paint
    2. e.Graphics.FillRectangle(Brushes.Blue, New Rectangle(10, 10, 200, 200))
    3. End Sub

    Frage: Was muss ich in meinem Usercontrol notieren um zu erreichen, dass das Rechteck nicht auf das Usercontrol selber, sondern auf die darin enthaltene PictureBox gezeichnet wird?
    @Artentus: Das Rectangle wird in der Form bestimmt und so auf das Usercontrol abgesetzt. Packe ich meine Anweisungen alle in das Usercontrol widerspricht das der üblichen Herangehensweise. Ich will das Usercontrol ja später noch für andere Sachen nutzen können.
    Sieh dir mal an, wie es die anderen Controls machen. Du kannst das Aussehen zu einem gewissen Grad über die Eigenschaften bestimmen, das Zeichnen an sich übernehmen sie aber selbst. So funktioniert das objektorientierte Konzept und genau so solltest du es auch anwenden. Wenn du das Aussehen des UserControls so entscheidend verändern willst, dass das nicht mehr über Eigenschaften machbar ist, dann ist das ein Indiz dafür, dass es zwei verschiedene Klassen sein sollten (die möglicherweise von der gleichen Basisklasse erben).
    Hmm... ich hol mal weiter aus: Vorher hatte ich auf meiner Form eine Picturebox. Die habe ich invalidiert und dann im Paint das nötige reingeschrieben. Jetzt habe ich aus der Picturebox aber ein Usercontrol (Picturebox plus Scrollbars) gemacht und würde das gerne genau so behandeln wie eine Picturebox.
    Dachte ich auch, wozu den Ballast einer Picturebox mit rumschleppen? Das Bild kann man ja ganz schlank auf das Control selber zeichen. Aber wie so oft, steckt der Teufel auch hier im Detail. Flackern trotz DoubleBuffer beim Verschieben zb. Letztendlich habe ich mich für die Box entschieden.

    Philipp66 schrieb:

    Frage: Was muss ich in meinem Usercontrol notieren um zu erreichen, dass das Rechteck nicht auf das Usercontrol selber, sondern auf die darin enthaltene PictureBox gezeichnet wird?
    na logischerweise musst du das Paint-Event der PictureBox behandeln, und auch die Picturebox invalidieren.

    Ich frage mich, was die Leuts hier alle mit DoubleBuffered haben - dassis kein Heilmittel für alles. Im Gegenteil: es ist nur in ganz ganz wenige Szenarien gewinnbringend.

    Und grad Picturebox ist eh von Haus aus doublebuffered.
    @Philipp66: Wenn, dann reich einen Event-Auslöser in das UseerControl und mach den Rest dort:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Me.Usercontrol1.InvalidateMe() ' Event in das UserControl tragen
    3. End Sub

    VB.NET-Quellcode

    1. Private Sub InvalidateMe()
    2. Me.PictureBox1.Invalidate() ' die PictureBox invalidisieren
    3. End Sub
    4. Private Sub PictureBox1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
    5. e.Graphics.FillRectangle(Brushes.Blue, New Rectangle(10, 10, 200, 200)) ' und neu zeichnen
    6. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!