Announcement

Collapse
No announcement yet.

UserControl

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • UserControl

    Hallo,

    Habe vollgendes Problem:

    habe ein Usercontroll erstellt und in diesem eine PictureBox darauf platziert. In der Funktion Load Zeichne ich eine linie mittels GDI in dieser PicturBox.
    Was mache ich falsch, das die Linie nicht zur Laufzeit angezeigt wird? Wenn ich die Größe des Usercontrols verändere wird diese Linie in der Picturebox gezeichnet. Wenn aber der Usercontroll den Focus verliert verschwindet auch die Linie. In VB gabs ja die Funktion Autoredraw, die jetzige Paint Funktion scheint nicht so richtig zu Funktionieren. Kann mir jemand das erklären wie es im NET funktioniert.

    Gruß
    Meissner

  • #2
    Hallo,

    Was mache ich falsch, das die Linie nicht zur Laufzeit angezeigt wird?
    das eigene User Control muss muss die geerbte Methode OnPaint überschreiben, um dort die Aufrufe unterzubringen, die für das Neuzeichnen des Control-Inhalts zuständig sind. Die Methode OnPaint wird immer dann aufgerufen, wenn der Inhalt des vom User Control belegten Fensterbereichs über die Methode Invalidate als ungültig gekennzeichnet wurde.

    Comment


    • #3
      Hallo

      erstmals Danke schön. Aber das ist mir jetzt ganz abstrakt. Kanns Du mir das vielleicht anhand von einen kleinen Beispiel erklären. Hier wäre sicherlich bischien Queltext sehr hilfreich.
      Wie wird die Methode OnPaint überschrieben, wie wird die Invalidate eingesetzt.

      Gruß
      Meissner

      Comment


      • #4
        Hallo,

        soweit bin ich gekommen und die Linie wird auch gezeichnet. Problem ist jetzt aber, dass die Linie permanent gezeichent wird, das bedeutet, dass diese die ganze Zeit flackert. Es liegt an der Funktion Invalidate.
        Meine Frage: wo muss diese in diesem Fall Platziert werden, damit die Linie nicht flackert bzw. nicht immer neu gezeichnet wird aber trozdem immer sichtbar bleibt?

        Das Usercontrol hat nur die Picturebox in der die Linie gezeichent wird. Wenn der Usercontrol auf der Form Platziert wird soll diese Linie die ganze Zeit sichtbar bleiben.

        Das Beispiel:

        Usercontroll. In der Form in der das Usercontroll platziert ist gibs kein Quelltext.

        Imports System.Drawing.Drawing2D

        Public Class UserControl1
        Inherits System.Windows.Forms.UserControl

        Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)

        MyBase.OnPaint(e)
        Call LinieZeichnen()

        End Sub

        Private Sub UserControl1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        AddHandler PictureBox1.Paint, AddressOf PictureBox1_Paint

        Call LinieZeichnen()

        End Sub

        Sub LinieZeichnen()

        Dim g As Graphics = Me.PictureBox1.CreateGraphics
        Dim p As New Pen(Color.Black, 3)

        g.DrawLine(p, 0, 10, Me.PictureBox1.Width, 10)
        g.Dispose()

        Me.PictureBox1.Invalidate()

        End Sub

        Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint

        End Sub

        Gruß
        Meissner

        Comment


        • #5
          Hallo,

          in LinieZeichnen darf nicht sofort Invalidate aufgerufen werden, denn damit wird der soeben gemalte Bereich sofort wieder als ungültig erklärt, so dass Windows die Botschaft WM_PAINT verschickt und das User Control die geerbte OnPaint-Methode aufruft, so dass sich die Endlos-Schleife mit dem ständigen Flackern ergibt.

          Die Methode Invalidate darf man nur dann aufrufen, wenn das erneute Zeichnen der Benutzeroberfläche vom User Control benötigt wird.

          Comment

          Working...
          X