vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Blitzschnelles Erstellen von grafischen Diagrammen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Hilfe bei GDI vb.net 2010 
Autor: Parallax
Datum: 03.07.12 18:48

Hallo,

ich möchte auf einem Form Linen zeichnen.

Dabei habe ich folgenden Code gefunden:

Dim g as Graphics
Dim p As Pen = New Pen(Color.Black, 5)


Public Sub frmMain_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

g = e.Graphics

End Sub

Nun möchte ich auf einen Button klicken und es soll mit


g.DrawLine(p, 400, 160, 400, 400)

eine Linie gezeichnet werden.

Allerdings führt das zu einem Fehler.

Wenn ich beide Anweisungen in frmMain_Paint schreibe, dann zeichnet er mir eine Linie.

Aber ich möchte bei einem Button Click eine Linie haben, nicht bei frmMain_Paint...

Was muss ich machen, damit das was ich will funktioniert??

Mfg
Parallax

Am morgen nen Joint und der Tag is dein Freund

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Hilfe bei GDI vb.net 2010 
Autor: sv00010
Datum: 03.07.12 18:56

Vielleicht hilft dir das weiter:

http://www.pda-dev.de/topic.asp?TOPIC_ID=1413

http://openbook.galileocomputing.de/vb_net/msvb110000.htm

http://openbook.galileocomputing.de/einstieg_vb_2010/
0

Beitrag wurde zuletzt am 03.07.12 um 19:09:56 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Hilfe bei GDI vb.net 2010 
Autor: Manfred X
Datum: 03.07.12 19:22

Hallo!

Im Paint-Ereignis wird auf dem Formular gezeichnet.
Dafür ist dieses Ereignis eingerichtet.

Durch den Aufruf von "Invalidate" wird das Neu-Zeichnen
angefordert (z.B. für eine Region, einen Rechteck-Bereich oder
für das gesamte Formular) bzw. durch "Refresh" erzwungen.

Erkläre ein wenig genauer, welche Figur(en) Du unter
welcher Bedingung auf das Formular zeichnen möchtest.

Definiere z.B. die Figuren in globalen Variablen und setze
jeweils eine Boolen (Visible), um anzugeben, welche Figuren
aktuell gezeichnet werden sollen.
Dafür bietet es sich an, eine Klasse zu erstellen, in der
die Figurparameter durch Eigenschaften gesetzt werden
(Farbe, Form, Location, Visible).
Die Instanzen dieser Klasse können in einer List(of ) verwaltet werden

In deinem Button_Click setzt Du diese Bools und rufst Invalidate.

Im Paint-Ereignis fragst Du in einer Schleife die aktuellen Eigenschafts-Werte
der gelisteten Figuren ab.
Daran entscheidet sich welche Draw-Methoden mit welchen Figurparametern
per e.graphics gezeichnet werden.

MfG
Manfred
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Hilfe bei GDI vb.net 2010 
Autor: Parallax
Datum: 03.07.12 21:31

Hi,

soweit hat das hingehauen...

Ich erklär mal was ich vorhabe:

Es soll am Form ein Koordinatensystem angezeigt werden.

Dieses zeichne ich mit der Sub Achsen()

Im Form Paint Event habe ich nun stehen:

Call Achsen()

Das hat schon den ersten negativen Effekt.

Setze ich Call Achsen() in Form_Load, dann sind die Achsen und vor allem die Beschriftungen glasklar.

Setze ich Call Achsen() in Form_Paint dann sind vor allem die Achsenbeschriftungen irgendwie verschwommen



Nun zu Punkt 2:

Ein Timer zeichnet eine Kurve. Dabei wird jeder neue X/Y Wert in eine Array aus varX(60) und varY(60) geschrieben.


Bei jedem Timer_Tick zeichnet eine Schleife eine Linie von X(0) Y(0) nach X(1) Y(1), dann von X(1) Y(1) nach X(2) Y(2) usw...

Nach einer Minute sind wir dann bei X(60) Y(60), nun wird jeder Wert im Array eine Stelle nach unten kopiert, also X(0) = X(1), X(1) = X(2), usw, und der neue Wert in X(60) geschrieben.

Somit will ich erreichen das die Kurve "wandert" nachdem sie das rechte Ende des Koordinatensystems erreicht hat.

Mfg
Parallax

Am morgen nen Joint und der Tag is dein Freund

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Hilfe bei GDI vb.net 2010 
Autor: Parallax
Datum: 04.07.12 00:43

Nachtrag:

das mit den Schriften hab ich über die Rendering Einstellung hingebracht.

Aber nun macht mir da "Kurve nach links verschieben" ein Problem

Die Kurve verschiebt sich zwar nach links, aber die alten Kurven bleiben bestehen, so das ich einen "Kurvenbatzen" erhalte.

Weiß da jemand Rat?

Am morgen nen Joint und der Tag is dein Freund

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Hilfe bei GDI vb.net 2010 
Autor: Manfred X
Datum: 04.07.12 00:44

Hallo!

Vielleicht geht es doppelt gepuffert.
Public Class frmCurve
 
    Dim WithEvents tim As New Timer With _
        {.Interval = 100, .Enabled = True}
 
    Dim pointstodraw As New System.Collections.Generic.List(Of Point)
 
    Private Sub frmCurve_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load
 
        FormBorderStyle = Windows.Forms.FormBorderStyle.FixedSingle
        Size = New Size(400, 400)
        BackColor = Color.White
        DoubleBuffered = True
 
        pointstodraw.Add(New Point(0, 0))
    End Sub
 
    Private Sub frmCurve_Paint(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
 
        Using br As New SolidBrush(Color.Black), _
                br_line As New SolidBrush(Color.Red), _
                pn As New Drawing.Pen(br, 2), _
                pn_line As New Drawing.Pen(br_line, 2)
            With e.Graphics
                .DrawLine(pn, 5, (Me.Height - 10) \ 2, Me.Width - 10, ( _
                  Me.Height - 10) \ 2)
                .DrawLine(pn, Me.Width \ 2, 5, Me.Width \ 2, Me.Height - 25)
                For i As Integer = 0 To pointstodraw.Count - 2
                    .DrawLine(pn_line, pointstodraw(i), pointstodraw(i + 1))
                Next
                .DrawString("x-achse, links", New Font("Arial", 12), br, 5, ( _
                  Me.Height - 50) \ 2)
            End With
        End Using
    End Sub
 
    Private Sub tim_Tick(ByVal sender As Object, ByVal e As System.EventArgs) _
      Handles tim.Tick
        Static ang As Double = 0
        ang += 0.1
        Dim y As Integer = CInt(Math.Sin(ang) * (Me.Height - 40) / 2) + ( _
          Me.Height - 40) \ 2
        Dim x As Integer = pointstodraw(pointstodraw.Count - 1).X + 3
        If x > Me.Width - 20 Then
            For i As Integer = pointstodraw.Count - 1 To 1 Step -1
                pointstodraw(i) = New Point(pointstodraw(i - 1).X, pointstodraw( _
                  i).Y)
            Next i
            pointstodraw.RemoveAt(0)
        End If
        pointstodraw.Add(New Point(x, y))
        Invalidate()
    End Sub
End Class
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Hilfe bei GDI vb.net 2010 
Autor: Parallax
Datum: 04.07.12 15:11

Funktioniert leider so nicht.

Mit Invalidate verschwindet die Linie und die neue wird gezeichnet, das führt zu einem ständigen Flackern.

Aber ich habe eine neue Lösung, die jedoch noch etwas angepasst werden muss.

mit g.Clear(Color)

kann ich kurz vor dem Zeichnen die Zeichenoberfläche löschen und gleich im Anschluss darauf wird neu gezeichnet. Nur kann ich Clear nicht auf das ganze Form anwenden.

Also habe ich mir überlegt, ich Zeichne die Achsen auf das Form, die Kurve jedoch in ein Panel oder PicBox oder so. Damit kann ich das Panel mit Clear immer wieder löschen. Jedoch ist das Problem, das ich ein Panal nicht transparent bekomme und somit meine Achsen nicht mehr zu sehen sind.
Hat jemand eine Idee wie das behoben werden kann??

Mfg
Parallax

Am morgen nen Joint und der Tag is dein Freund

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Hilfe bei GDI vb.net 2010 
Autor: Manfred X
Datum: 04.07.12 15:29

Hallo!

Ich habe den Eindruck, Deine Vorgehensweise ist ungeeignet.

Du schilderst die Effekte, die Dein Programm erzeugt, aber nicht,
was Du programmiert hast.

Was verstehtst Du unter "Zeichenoberfläche"?
Wenn Du per Paint-Event direkt auf die Form zeichnest, ist ein Clear überflüssig.
Das Formular wird neu gezeichnet.

(Im übrigen sollte mein Beispiel für Deinen Zweck - so weit dargestellt -
durchaus funktionieren ...)

Du kannst eventuell eine Picturebox zum Zeichnen nutzen und feststehende Elemente
in eine Bitmap eintragen, die als Hintergrundbild der Picturebox zugewiesen wird.

MfG
Manfred
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Hilfe bei GDI vb.net 2010 
Autor: Parallax
Datum: 04.07.12 16:12

Ich lasse mit dem Form_Paint Ereigniss Achsen auf das Form zeichnen.

In einem Timer lasse ich eine Linie auf das Form zeichnen.

Nun will ich das sich die Linie nach links verschiebt, wenn sie den Rand des Koordinatensystems erreicht hat.

Problem hierbei: Die alten Linien bleiben erhalten, somit erhalte ich "Linienbatzen"

Lösung: Direkt vor g.DrawLine() setze ich g.Clear()

Problem hierbei: Es löscht mir das komplette Form samt Achsen.

Nun will ich ein Panel über das Form setzen und als Zeichenoberfläche das Panel mit

g.panel.CreateGraphics

festlegen, und dann immer nur das Panel löschen.

Problem nun: Panel ist nicht transparent und verdeckt mir meine Achsen.

Mfg
Parallax

Am morgen nen Joint und der Tag is dein Freund

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Hilfe bei GDI vb.net 2010 
Autor: Manfred X
Datum: 04.07.12 16:27

Hallo!

ALLE Zeichenoperationen (und sonst möglichst nichts) gehören
in das Paint-Event.
Im Timer-Tick werden nur die zu zeichnenden Datenstrukturen
aktualisiert. Danach Invalidate. Kein Clear.

Wenn Du Hintergrund-/Vordergrund trennen willst,
verwende eine Picturebox. Der Image-Eigenschaft
kannst Du eine Bitmap zuweisen, deren Fläche
per Graphics.Clear(Color.Transparent) gesetzt worden ist.

Beitrag wurde zuletzt am 04.07.12 um 16:38:06 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Hilfe bei GDI vb.net 2010 
Autor: Parallax
Datum: 04.07.12 17:02

Kannst du mir das genauer erklären?

Ich soll also eine picbox nehmen

Die Achsen zeichne ich auf g.picbox.creategraphics

Die Kurve auf g.picbox.image.creategraphics

Geht das überhaupt?

Ich komm mit deinem Vorschlag net ganz klar...

Mfg
Parallax

Am morgen nen Joint und der Tag is dein Freund

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Hilfe bei GDI vb.net 2010 
Autor: Manfred X
Datum: 04.07.12 17:07

Hallo!

Hier ist ein kleines Beispiel (es gibt im Forum noch andere).
http://www.vbarchiv.net/forum/read.php?f=22&t=83808&i=83836
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Hilfe bei GDI vb.net 2010 
Autor: xirton
Datum: 04.07.12 17:28

Vielleicht lohnt sich mal ein Blick auf das Charting Control von Microsoft zu werfen, oder auf freie Bibliotheken wie ZedGraph, welche sich wunderbar eignen um Graphen usw. zu zeichnen. Gerade das plotten ... also weiterschieben des Graphen geht damit sehr einfach von der Hand.
Wenn du es allerdings selber machen willst und alles "von Hand" zeichnen magst, dann habe ich nichts gesagt .

Beitrag wurde zuletzt am 04.07.12 um 17:29:56 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Hilfe bei GDI vb.net 2010 
Autor: xirton
Datum: 04.07.12 17:38

oops doppelpost

Beitrag wurde zuletzt am 04.07.12 um 17:39:24 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Hilfe bei GDI vb.net 2010 
Autor: Parallax
Datum: 04.07.12 17:57

Das mit den Bitmaps hat funktioniert...

Wunderbar, danke...

Am morgen nen Joint und der Tag is dein Freund

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel