none
VB.net Text drehen

    Allgemeine Diskussion

  • Imports System.Math
    Public Class Form1
    
        'Voraussetzungen: 1. Textbox1 in die Form1 einfügen. Sie ist für den X Wert zuständig
        '                 2. Textbox2 in die Form1 einfügen. Sie ist für den Y Wert zuständig
        '                 3. Textbox3 in die Form1 einfügen. Sie ist für den Drehwinkel zuständig
        '                 4. Textbox4 in die Form1 einfügen. Sie ist für den auzugebebden Text zuständig
        '                 5. Panel1 in die Form1 einfügen. Das Panel ist zum Zeichnen da. Es kann aber auch alles Panel ähnliche verwendet werden. (z.B. Groupbox u.s.w.)
        '                 6. Button1 in die Form1 einfügen. Er löst die Zeichenaktion aus.
        '                 7. Button2 in die Form1 einfügen. Er löscht das temporärgezeichnete des Button1.
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            'was durch diesen Button gezeichnet wird kann nicht gedruckt werden!!! Da sich das Panel beim Screenshot automatisch neu zeichnet.
            If TextBox1.Text = "" Or TextBox2.Text = "" Or TextBox3.Text = "" Then
                MsgBox("Bitte tragen Sie überall Werte ein", MsgBoxStyle.ApplicationModal)
                Exit Sub
            End If
            Dim objFont = New Font("Arial", 9, FontStyle.Bold)
            Dim objBrush As SolidBrush = New SolidBrush(Color.Black)
            Dim objGraph As Graphics = Me.Panel1.CreateGraphics
            Dim WinkelQ As Double, WinkelW As Double, Wed As Double, X1 As Double, Y1 As Double
            Wed = (TextBox1.Text ^ 2 + TextBox2.Text ^ 2) ^ 0.5
            WinkelQ = Atan(TextBox2.Text / TextBox1.Text) * 180 / PI
            WinkelW = TextBox3.Text - WinkelQ
            Y1 = -Wed * Sin(WinkelW * PI / 180)
            X1 = Wed * Cos(WinkelW * PI / 180)
            With objGraph
                .SmoothingMode = Drawing.Drawing2D.SmoothingMode.AntiAlias
                .RotateTransform(TextBox3.Text)
                .DrawString(TextBox4.Text, objFont, objBrush, X1, Y1)
                .ResetTransform()
            End With
            objGraph.Dispose()
    
        End Sub
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Me.Panel1.Refresh()
        End Sub
    
    
    
        'Private Sub Panel1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint
        '    'dieser Befehl ist zum dauerhaften Zeichnen! Also wenn man das gezeichnet in dem Panel1 in einem Screenshot verwenden möchte
        '    If TextBox1.Text = "" Or TextBox2.Text = "" Or TextBox3.Text = "" Then
        '        Exit Sub
        '    End If
        '    Dim objFont = New Font("Arial", 9, FontStyle.Bold)
        '    Dim objBrush As SolidBrush = New SolidBrush(Color.Black)
    
        '    Dim WinkelQ As Double, WinkelW As Double, Wed As Double, X1 As Double, Y1 As Double
        '    Wed = (TextBox1.Text ^ 2 + TextBox2.Text ^ 2) ^ 0.5
        '    WinkelQ = Atan(TextBox2.Text / TextBox1.Text) * 180 / PI
        '    WinkelW = TextBox3.Text - WinkelQ
        '    Y1 = -Wed * Sin(WinkelW * PI / 180)
        '    X1 = Wed * Cos(WinkelW * PI / 180)
        '    With e.Graphics
        '        .SmoothingMode = Drawing.Drawing2D.SmoothingMode.AntiAlias
        '        .RotateTransform(TextBox3.Text)
        '        .DrawString(TextBox4.Text, objFont, objBrush, X1, Y1)
        '        .ResetTransform()
        '    End With
        '    e.Graphics.Dispose()
        'End Sub
    End Class

    Hallo, ich habe eine Frage.

    wie kann ich das paintevent in einem Button bringen? Das Problem ist wenn ich den von mir geschriebenen Button aktion ausführe kann ich das gezeichnete nicht drucken weil sich das Panel ja beim Screenshoot refreshed. wenn ich aber nur mit dem in meinem code aus komentierten paint event arbeite kann ich nur einen Text darstellen lassen im Screenshoot.

    Das Ziel soll am Ende sein das ich per button immer weitere Texte zeichnen lasse und die schon geschriebenen Texte nicht verschwinden beim screenshoterstellen.

    Hat jemand eine Idee wie ich das hinbekommen kann?

    Gruß Lenny

    Montag, 8. Juli 2013 08:22

Alle Antworten

  • Hallo, ich habe zwar nicht zu 100% verstanden, wie dein Code funktionieren soll, aber ich nehme mal an, das du das Paint-Event aus dem Button-Click-Handler heraus aufrufen möchtest. Dazu musst du nur die Invalidate() Methode aufrufen. Diese sorgt dafür das der Zeichenbereich für ungültig erklärt wird und und Paint entsprechend neu ausgeführt wird.

    Wenn du immer mehr Texte auf die Form bringen möchtest, dann musst du diese in einer Liste speichern und dann im Paint malen. Das Problem mit CrateGraphics liegt darin, das selbst ein Verschieben der Form das  Paint-Event auslösen kann und das gezeichnete wieder zerstört.

    Ich nehme mal an, das du für jeden Text eine eigene Drehung usw. haben möchtest. Dazu musst du dir eine Klasse anlegen, die die ganzen Werte in einer Instanz speichert. Von dieser Klasse erstellst du dann die Liste und Fragst dann im Paint-Event nicht die TextBoxen, sondern die Elemente der Liste aus.

    MSDN-Artikel zu List(Of T): http://msdn.microsoft.com/de-de/library/vstudio/6sh2ey19.aspx


    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets
    Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
    Einen Konverter zwischen C# und VB.NET Code gibt es hier.

    Montag, 8. Juli 2013 10:03
  • *******************************************************************************************************
    Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
    Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
    *******************************************************************************************************

    Montag, 15. Juli 2013 14:35
  • Also der Benutzer soll den x,y,winkel und Textwert eintragen und wenn er auf button1 klick soll es in das panel eintragen werden und dann soll erweitere werte eintragen ohne das die schon geschriebenen werte verschwinden. Die Winkelumrechnung mache ich damit der Benutzer einfacher die Position ausmachen kann, weil wenn ich den Pinsel drehe dann dreht sich auch das Koordinatensystem x und y.

    Danke für den Tipp mit den speichern. Daran hab ich noch nicht gedacht. wenn ich das dauerhaft speichern will muss ich dann wohl in eine txt Datei  exportieren, oder gibt es auch etwas eleganteres?

    • Bearbeitet LennyBAM Montag, 15. Juli 2013 15:37 hat nicht ganz gereicht.
    Montag, 15. Juli 2013 15:29
  • Ich habe mal ein kleines Beispiel dazu erstellt. Es hat nicht deine ganzen Berechnungen drinn usw., sollte aber die Grundfunktion zeigen.

    Public Class Form1
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
           Dim item As New Item()
            With item
                .Text = TextBoxText.Text
                .Degree = Single.Parse(TextBoxDegree.Text)
                .X = Integer.Parse(TextBoxX.Text)
                .Y = Integer.Parse(TextBoxY.Text)
            End With
            Me.list.Add(item)
            Me.Invalidate()
        End Sub
    
        Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint
            Dim objFont = New Font("Arial", 9, FontStyle.Bold)
            Dim objBrush As SolidBrush = New SolidBrush(Color.Black)
    
            For Each s As Item In Me.list
                'Alle Items durchgehen
                e.Graphics.SmoothingMode = Drawing.Drawing2D.SmoothingMode.AntiAlias
                e.Graphics.RotateTransform(s.Degree)
                e.Graphics.DrawString(s.Text, objFont, objBrush, s.X, s.Y)
                e.Graphics.ResetTransform()
            Next
        End Sub
    
        Dim list As New List(Of Item)
    End Class
    
    Structure Item
        Public Property Text As String
        Public Property Degree As Single
        Public Property X As Integer
        Public Property Y As Integer
    End Structure

    Ich Erzeuge bei jedem Buttonklick ein neues Element in der Liste und erkläre die Zeichenfläche für ungültig (Inavlidate()), damit Paint neu aufgerufen wird. Dort werden dann alle Grafiken auf die Form gezeichnet.

    Um Daten dauerhaft zu speichern ist entweder eine Datei die richtige Wahl oder für Anwendungsspezifische Dinge My.Settings.

    PS: Mein Code ist komplett Option Strict On. Das hilft ggf. auch mal schneller einen Fehler zu finden
    PPS: Benutze Math.Sin/Math.Cos, anstelle der alten VB-Classic Funktionen.


    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Montag, 15. Juli 2013 19:44
  • danke für die Hilfe. :-)

    Welche datei würdest du den dafür empfehlen? excel. access, oder noch was anderes?

    Was hat es mit dem option strict on auf sich? was bewirkt es?

    zum p.p.s... nehm ich das nicht schon weil ich doch oben stehen habe: Imports System.Math?

    oder hab ich einen Denkfehler?


    • Bearbeitet LennyBAM Montag, 15. Juli 2013 21:41 zusatz frage
    Montag, 15. Juli 2013 21:40
  • Hi,
    eine Datei ist nur dann sinnvoll, wenn die Information zwischen Programmende und Neustart erhalten bleiben soll. Als Dateityp eignet sich dafür am besten eine XML-Datei.

    Option Strict On bewirkt das Ausschalten der impliziten Typkonvertieren. Nicht typgerechte Zuweisungen werden dann als Fehler angezeigt. Bei Option Strict Off versucht der Compiler selbst eine Typkonvertierung festzulegen, was u.U. zu unerwünschten Ergebnissen führen kann.

    Imports System.Math sagt dem Compiler nur, dass er, falls er einen Verweis nicht auflösen kann, auch in diesem Namensraum suchen soll. Wenn Du die Klassen aus diesem Namensraum im Programm nicht nutzt, ist das Imports auch nicht erforderlich, stört aber auch nicht.

    --
    Peter

    Dienstag, 16. Juli 2013 05:39
  • Danke  für die Erklärung. Das hat mir wieder ein paar Fragen beantworten.

    Danke für eure hilfe.

    Gruß Lenny

    Dienstag, 16. Juli 2013 09:11