DrawLine endet in einem eingeschränkten Fenster

  • VB.NET

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

    DrawLine endet in einem eingeschränkten Fenster

    Beim Ausprobieren eines Tutorials stellte ich fest, das die Linien und Rechtecke nur in einem Fenster unter einer Breite und Höhe von 300 px. gezeichenet werden:

    Public
    ClassGrundformenZeichnen
    Dim z AsGraphics = Me.CreateGraphics()
    Dim stift AsNewPen(Color.Red, 2)
    Dim pinsel AsNewSolidBrush(Color.Red)
    PrivateSub cmdLinie_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdLinie.Click
    z.DrawLine(stift, 0, 0, 400, 400)
    EndSub
    PrivateSub cmdRechteck_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdRechteck.Clickz.DrawRectangle(stift, 10, 10, 470, 240)
    EndSub
    End Class
    Wie kann man den Zeichenbereich vergrößert festlegen?
    Gruß von einem
    DelphiUmsteiger
    Moin,
    zunächst mal Bitte VB Tags benutzen - was ist damit gemeint?. Das liest sich dann besser.
    Dann solltest du dieses sog. "Tutorial" vergessen. Mit GDI zeichnet man grundsätzlich im Paint-Event des Controls. Me.Create ist Mist. das merkst du dann, wenn du die bemalte Form mal größer ziehst, minimierst oder aus dem Screen rausschiebst. Also eine ZeichenSub (m.w. in einem Button-Klick) in der die Koordinaten für Startpunkt und Größe deines Rectangles, bzw. das Zeichenobjekt selbst, festgelegt werden und dann mit Invalidate() die Form zum Zeichnen zwingen.
    Der Zeichenbereich ist der Clientbereich deines Controls (z.B. Form) Dieser hat ein Koordinatensystem dessen 0-Punkt sich oben links befindet. gezählt wird dann in Pixeln nach rechts (x_achse) und nach unten (y-Achse). Du kannst durchaus auch außerhalb dieses Bereiches zeichnen und diese Zeichnung durch Ziehen der Form sichtbar machen. Voraussetzung dafür ist ResizeRedraw=true.
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Willkommen im Forum. :thumbup:
    Zunächst gibt es hier einen [ VB ]-Button, damit wird der (markierte) Quelltext ordentlich dargestellt.
    Dann hat .NET da eine andeere Philosophie, bei C++ war das auch schon so, bei Delphi weiß ich nicht.
    Alles was zu malen ist, passiert im Paint-Event, das Graphics-Objekt bekommst Du dabei geliefert
    In dieser Prozedur kann / muss die ganze GUI "aus dem Gedächtnis" dargestellt werden.
    Stelle also Daten bereit und sag Deinem Progrann, dass es sie neu zeichnen möge:

    VB.NET-Quellcode

    1. Invalidate(...) ' da kann man Bereiche festlegen, die neu gemalt werden sollen
    2. Update() ' da wird das Paint-Event aufgerufen.

    VB.NET-Quellcode

    1. Private Sub Form1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    2. Dim z = e.Graphics ' Graphics-Objekt auslesen
    3. Dim stift As New Pen(Color.Red, 2)
    4. Dim pinsel As New SolidBrush(Color.Red)
    5. z.DrawLine(stift, 0, 0, 400, 400)
    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!
    Vielen Dank für Eure Antworten. Habe sie zu spät gelesen, weil ich auf eine mail vom System gewartet habe. Wird man automatisch benachrichtigt, wenn einer geantwortet hat?
    Bis ich die VB-Logik verstehe, vergehen noch Ewikeiten.
    Das habe ich aus Euren Vorschlägen gemacht.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
    3. Dim z = e.Graphics ' Graphics-Objekt auslesen
    4. Dim stift As New Pen(Color.Red, 2)
    5. Dim pinsel As New SolidBrush(Color.Red)
    6. z.DrawLine(stift, 0, 0, 400, 400)
    7. End Sub
    8. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    9. Dim Karte As New Rectangle(200, 5, 400, 400)
    10. Invalidate(Karte)
    11. ' Update()
    12. End Sub
    13. End Class


    Ich möchte eine Karten mit vielen Kreisen (Städte des Traveling salesman) und die Verbindungslinien zeichnen, jedesmal dann wenn eine neue Route berechnet wurde, also nicht gleich am Anfang alles, sondern auf Klick!
    vlt. sollteste als erstes Video-Tut: Visual-Studio richtig benutzen mal angugge.

    Dann kennst du zB den ObjectBrowser, und kannst nachgucken, was Invalidate(Karte) ühaupt bewirkt.

    So eine Datenverarbeitung schreibt man aber nicht ohne fundierte VB.Net-Kenntnisse, deshalb dieses Buch lesen (hingegen das Galileio-Openbook ist Mist)
    Wenn Du das Painting studieren willst, solltest Du es dynamisch machen, also eine Koordinate per Buttondruck verändern, damit Du verfolgen kannst, was da auf der Form passiert.
    Diese Variable musst Du dann natürlich aus der Prozedur in die Klasse verlagern.
    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!