none
Wie zeichne ich ein Textfeld wie in Paint? RRS feed

  • Frage

  • Hallo

    ich möchte gern zur Laufzeit in einer Form auf einen Panel ein Textfeld zeichnen, wo ich dann ein Text eingeben kann und diese im Panel verschieben kann.

    Wie setze ich das nun um? Hab leider nicht soviel beim googeln gefunden.

    LG

    jeanny26

    Sonntag, 24. Oktober 2010 13:08

Antworten

  • Hallo Community, folgender Code zeigt, wie Ihr in ein Bitmap Objekt Text zeichnen könnt.

    Zum Ausführen dieses Codes ist eine Fom1 und ein Panel1 erforderlich.

    Bedienung: 1x klicken in Form1: zeichnen

    2x Klicken: Bitmap wird gespeichert.

    Viel Spaß & schöne Grüße Ellen

     

     

     

    Imports System.Drawing
    Public Class Form1
     'Typ auf Klassenebene deklarieren, damit Klassenmember darauf zugreifen können
     Private meinBitmap As Image
    
    
     Private Sub Form1_MouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseClick
    
      'auf das Bitmap ein Grafic Objekt legen:
      Dim g As Graphics = Graphics.FromImage(meinBitmap)
      'Malfarbe festlegen
      Dim br As Brush = Brushes.White
      'Font für Ausgabe wöhlen
      Dim myFont = New Font("Microsoft Sans Serif", 19.0!, _
            System.Drawing.FontStyle.Regular, _
            System.Drawing.GraphicsUnit.Point, _
            CType(0, Byte))
    
      Dim txt = "Hallo Welt"
      ' in die obere linke Ecke malen:
      Dim pt As Point = Point.Empty
      'Hintergrund rot
      g.Clear(Color.Red)
      'Abmessungen des zu zeichnenden Objekts ermitteln:
      Dim sz As SizeF = g.MeasureString(txt, myFont)
      'prüfen, ob der String in die Zeichenfläche passt:
      If sz.Width < Panel1.Width And sz.Height < Panel1.Height Then
       'Malen
       g.DrawString(txt, myFont, br, pt)
      End If
      'Bitmap ausgeben
      Panel1.BackgroundImage = meinBitmap
    
     End Sub
    
     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      'eine neue Bitmap erzeugen von der Größe des Panels
      meinBitmap = New Bitmap(Panel1.Width, Panel1.Height)
    
     End Sub
    
     Private Sub Form1_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDoubleClick
      meinBitmap.Save("D:\test2.jpg")
      MsgBox("Bitmap gespeichert")
     End Sub
    End Class

    Ich benutze/ I'm using VB2008 & VB2010
    Sonntag, 24. Oktober 2010 16:10
  • Public Class Form1
      Private meinBitmap As Image
      Private g As Graphics
    
      Private Sub Form1_MouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseClick
        g.Clear(Color.Red)
        PictureBox1.Image = meinBitmap
        PictureBox1.Image.Save("D:\test.jpg")
      End Sub
    
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'eine neue Bitmap erzeugen von der Größe der PichtureBox
        meinBitmap = New Bitmap(PictureBox1.Width, PictureBox1.Height)
        'auf das Bitmap ein Grafic Objekt legen:
        g = Graphics.FromImage(meinBitmap)
      End Sub
    End Class
    

    Hallo jeanny,

    dann würde ich das anders machen. In das Panel eine PictureBox eindocken. Eine separate Bitmap erzeugen. darauf ein Graphics Object. Darin zeichnen und Bitmap an Picturebox übergeben. Damit lässt sich die Methode PictureBox.Image.Save anwenden

    Gruß Ellen


    Ich benutze/ I'm using VB2008 & VB2010
    Sonntag, 24. Oktober 2010 16:00
  • Hallo,

    ich benötige das für eine Art Zeitleiste bzw Storyboard, deswegen
    auch mit den zeichnen und in Paint kann man ja auch Textfelder
    zeichnen.

    Du kannst Du in der Paint-Ereignisprozedur einer Form oder eines
    Panels alles Mögliche (auch TextBoxen) mit Graphikmethoden
    zeichnen. Das Ergebnis sieht dann auch so aus, wie eine Textbox,
    doch eine Textbox ist es deshalb noch lange nicht. Wie und wo
    definierst Du Eigenschaften, Methoden und Ereignisse für diese
    Textboxen?

    Du solltest mal konkret beschreiben, was Du wirklich machen
    möchtest. Nur so wird es möglich einen konkreten Lösungsweg
    vorzuschlagen.

    Schau Dir mal das nachfolgende Beispiel, bei dem via Buttonklick
    neue Textboxen erstellt bzw. wieder entfernt werden. Ein Zeichnen
    mit Graphikmethoden im Paintereignis kommt darin nicht vor.

    Kopiere den nachfolgenden Code einfach in ein
    leeres Formmodul (Form1.vb).

    ' / / / Beginn Code Form1.vb
    Public Class Form1
        Private WithEvents Button1 As Button
        Private WithEvents Button2 As Button
        Private Panel1 As Panel

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

            Init()
        End Sub

        Private Sub Init()

            Panel1 = New Panel
            With Panel1
                .Name = "Panel1"

                .SetBounds _
                        (10, 10, _
                         Me.ClientSize.Width - 20, _
                         50)

                .Anchor = _
                        AnchorStyles.Left Or _
                        AnchorStyles.Top Or _
                        AnchorStyles.Right

                .BorderStyle = BorderStyle.Fixed3D
            End With
            Me.Controls.Add(Panel1)

            Button1 = New Button
            With Button1
                .Name = "Button1"
                .Font = New Font("Arial", 8)
                .Text = "Add Textbox"

                .SetBounds _
                        (10, Panel1.Bottom + 15, _
                         120, 36)

                .Anchor = _
                        AnchorStyles.Left Or _
                        AnchorStyles.Top

            End With
            Me.Controls.Add(Button1)

            Button2 = New Button
            With Button2
                .Name = "Button2"
                .Font = Button1.Font
                .Text = "Remove Textbox"

                .SetBounds _
                        (Button1.Right + 2, _
                         Button1.Top, _
                         Button1.Width, _
                         Button1.Height)

                .Anchor = Button1.Anchor
            End With
            Me.Controls.Add(Button2)

            Me.ClientSize = _
                    New Size _
                    (500, Button1.Bottom + 15)

            Me.MinimumSize = _
                    New Size(200, Me.Height)

            Me.MaximumSize = _
                    New Size _
                    (Screen.GetWorkingArea(Me).Width, _
                     Me.Height)
        End Sub

        Private Sub Button1_Click _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles Button1.Click

            Dim L As Integer

            Dim Idx As Integer = _
                Panel1.Controls.Count + 1

            If Idx < 2 Then
                L = 5
            Else
                L = _
                    Panel1.Controls _
                    ("TextBox" & (Idx - 1).ToString).Right + 3
            End If

            Dim TB As New TextBox
            With TB
                .Name = "Textbox" & Idx.ToString
                .Font = New Font("Arial", 12)
                .Width = 80
                .Text = .Name

                .Location = _
                        New Point _
                        (L, (Panel1.Height - .Height) \ 2)

            End With
            Panel1.Controls.Add(TB)

            AddHandler _
                    TB.TextChanged, _
                    AddressOf TextBox_TextChanged

            AddHandler _
                    TB.Enter, _
                    AddressOf TextBox_Enter

            ' ... weitere Eventhandler für diese Textbox hinzufügen....
        End Sub

        Private Sub Button2_Click _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles Button2.Click

            If Panel1.Controls.Count > 0 Then
                Dim TB As TextBox
                Dim Idx As Integer = Panel1.Controls.Count

                TB = _
                    DirectCast _
                        (Panel1.Controls("Textbox" & Idx.ToString),  _
                        TextBox)

                RemoveHandler _
                        TB.TextChanged, _
                        AddressOf TextBox_TextChanged

                RemoveHandler _
                        TB.Enter, _
                        AddressOf TextBox_Enter

                ' weitere Eventhandler für diese Textbox entfernen

                Panel1.Controls.Remove(TB)
            End If
        End Sub

        Private Sub TextBox_TextChanged _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs)

            Dim TB As TextBox = DirectCast(sender, TextBox)
            Me.Text = TB.Name & ": " & TB.Text
        End Sub

        Private Sub TextBox_Enter _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs)

            Dim TB As TextBox = DirectCast(sender, TextBox)
            Me.Text = TB.Name & " entered"
        End Sub

    End Class
    ' \ \ \  E N T E

    Nach dem Programmstart siehst Du die Form1 mit einem (noch)
    leeren Panel (Panel1) sowie zwei Buttons (Add Textbox u.
    Remove Textbox).
    Mit einem Klick auf den Button "Add Textbox" wird eine neue
    Textbox (mit zugehörigen Eventhandlern) im Panel hinzugefügt.
    Mit einem Klick auf den Button "Remove Textbox" wird die
    jeweils letzte Textbox (mit zugehörigen Eventhandlern) entfernt.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Montag, 25. Oktober 2010 13:02

Alle Antworten

  • Hallo jeanny26,

    mit der Graphics.Drawstring Methode:

    http://msdn.microsoft.com/de-de/library/system.drawing.graphics.drawstring.aspx

    Hier habe ich ein Codesample gefunden:

    http://www.vbdotnetheaven.com/UploadFile/dbeniwal321/315/Default.aspx

    schöne Grüße Ellen


    Ich benutze/ I'm using VB2008 & VB2010
    Sonntag, 24. Oktober 2010 13:17
  • Hallo!

    Eventuell sind folgende Ansätze brauchbar:

    INFO: Code Sample That Demonstrates How to Create a Custom Form Designer by Using Visual C# .NET
    http://support.microsoft.com/?scid=kb;EN-US;813808

    Hosting Windows Forms Designers
    http://divil.co.uk/net/articles/designers/hosting.asp

    Beste Grüße,
    Herfried


    Herfried K. Wagner [MVP]
    Sonntag, 24. Oktober 2010 13:38
  • Hallo

    das hat mir schon sehr weiter geholfen, nun habe ich noch eine Frage. Kann ich dieses gezeichnete dann auch in eine Datenbank speichern? Und als welchen Typ müsste ich das Panel nehmen? Wenn ich nicht verkehrt liege da es sich um eine Grafik handelt müsst man ja dann Image bzw Pictures als Typ in der Datenbank zuordnen.

    Wenn dieses so geht.

    LG

    jeanny26

    Sonntag, 24. Oktober 2010 14:20
  • Public Class Form1
      Private meinBitmap As Image
      Private g As Graphics
    
      Private Sub Form1_MouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseClick
        g.Clear(Color.Red)
        PictureBox1.Image = meinBitmap
        PictureBox1.Image.Save("D:\test.jpg")
      End Sub
    
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'eine neue Bitmap erzeugen von der Größe der PichtureBox
        meinBitmap = New Bitmap(PictureBox1.Width, PictureBox1.Height)
        'auf das Bitmap ein Grafic Objekt legen:
        g = Graphics.FromImage(meinBitmap)
      End Sub
    End Class
    

    Hallo jeanny,

    dann würde ich das anders machen. In das Panel eine PictureBox eindocken. Eine separate Bitmap erzeugen. darauf ein Graphics Object. Darin zeichnen und Bitmap an Picturebox übergeben. Damit lässt sich die Methode PictureBox.Image.Save anwenden

    Gruß Ellen


    Ich benutze/ I'm using VB2008 & VB2010
    Sonntag, 24. Oktober 2010 16:00
  • Hallo Community, folgender Code zeigt, wie Ihr in ein Bitmap Objekt Text zeichnen könnt.

    Zum Ausführen dieses Codes ist eine Fom1 und ein Panel1 erforderlich.

    Bedienung: 1x klicken in Form1: zeichnen

    2x Klicken: Bitmap wird gespeichert.

    Viel Spaß & schöne Grüße Ellen

     

     

     

    Imports System.Drawing
    Public Class Form1
     'Typ auf Klassenebene deklarieren, damit Klassenmember darauf zugreifen können
     Private meinBitmap As Image
    
    
     Private Sub Form1_MouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseClick
    
      'auf das Bitmap ein Grafic Objekt legen:
      Dim g As Graphics = Graphics.FromImage(meinBitmap)
      'Malfarbe festlegen
      Dim br As Brush = Brushes.White
      'Font für Ausgabe wöhlen
      Dim myFont = New Font("Microsoft Sans Serif", 19.0!, _
            System.Drawing.FontStyle.Regular, _
            System.Drawing.GraphicsUnit.Point, _
            CType(0, Byte))
    
      Dim txt = "Hallo Welt"
      ' in die obere linke Ecke malen:
      Dim pt As Point = Point.Empty
      'Hintergrund rot
      g.Clear(Color.Red)
      'Abmessungen des zu zeichnenden Objekts ermitteln:
      Dim sz As SizeF = g.MeasureString(txt, myFont)
      'prüfen, ob der String in die Zeichenfläche passt:
      If sz.Width < Panel1.Width And sz.Height < Panel1.Height Then
       'Malen
       g.DrawString(txt, myFont, br, pt)
      End If
      'Bitmap ausgeben
      Panel1.BackgroundImage = meinBitmap
    
     End Sub
    
     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      'eine neue Bitmap erzeugen von der Größe des Panels
      meinBitmap = New Bitmap(Panel1.Width, Panel1.Height)
    
     End Sub
    
     Private Sub Form1_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDoubleClick
      meinBitmap.Save("D:\test2.jpg")
      MsgBox("Bitmap gespeichert")
     End Sub
    End Class

    Ich benutze/ I'm using VB2008 & VB2010
    Sonntag, 24. Oktober 2010 16:10
  • Hallo

    danke für deine Hilfe ich probiert das mal aus und melde mich noch mal.

    lg

    jeanny26

    Sonntag, 24. Oktober 2010 16:26
  • Hallo,

    ich möchte gern zur Laufzeit in einer Form auf einen Panel
    ein Textfeld zeichnen, wo ich dann ein Text eingeben kann

    Ein solches Textfeld musst Du nicht selbst zeichnen, sondern
    kannst es ganz einfach zur Laufzeit erstellen.
    Mit Paint hat das erst mal gar nichts zu tun.

    So erstellst Du auf Deinem Panel (Panel1) eine Textbox:

        Private WithEvents TextBox1 as Textbox

        Private Sub AnySub
            TextBox1 = New Textbox
            With TextBox1
                .Name = "TextBox1"
                .Font = New Font ("Arial, 12)
                .SetBounds 10,10, 120, .Height
                .Text = .Name
            End With
            Panel1.Controls.Add TextBox1

    Du kannst Auch auf das WithEvents in der Deklaration
    verzichten und statt dessen die benötigten Ereignis-
    porzeduren per AddHandler (s. OH zu AddHandler,
    RemoveHandler) Deiner Textbox zuordnen.

    und diese im Panel verschieben kann.
    Wie setze ich das nun um? Hab leider nicht soviel
    beim googeln gefunden.

    Wie Du Steuerelemente (auch Textboxen) zur Laufzeit
    mit der Maus verschieben kannst zeigt Dir das Beispiel
    unter

        www.gssg.de -> Visual Basic -> VB.net
            -> Sonstige
                -> Move Control

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Montag, 25. Oktober 2010 07:07
  • Hallo Peter Götz

    ich benötige das für eine Art Zeitleiste bzw Storyboard, deswegen auch mit den zeichnen und in Paint kann man ja auch Textfelder zeichnen.

     

    LG

    jeanny26

    Montag, 25. Oktober 2010 09:12
  • Hallo Jeanny,

    ich zeige Dir mal ein Projekt von mir. Das ist alles gezeichnet mit Methoden der Graphics-Klasse in eine Picturebox. Das ist eine echte Fleissarbeit. Habe mehrere Tage daran programmiert. Aber hat Spaß gemacht. Mein Codebeispiel Nr 1 ist die Grundlage dafür. Damit bist Du auf dem richtigen Weg. Zeig uns mal einen Entwurf.

    schöne Grüsse Ellen

     

    Temperaturverläufe einer Heizungsanlage


    Ich benutze/ I'm using VB2008 & VB2010
    Montag, 25. Oktober 2010 12:43
  • Hallo,

    ich benötige das für eine Art Zeitleiste bzw Storyboard, deswegen
    auch mit den zeichnen und in Paint kann man ja auch Textfelder
    zeichnen.

    Du kannst Du in der Paint-Ereignisprozedur einer Form oder eines
    Panels alles Mögliche (auch TextBoxen) mit Graphikmethoden
    zeichnen. Das Ergebnis sieht dann auch so aus, wie eine Textbox,
    doch eine Textbox ist es deshalb noch lange nicht. Wie und wo
    definierst Du Eigenschaften, Methoden und Ereignisse für diese
    Textboxen?

    Du solltest mal konkret beschreiben, was Du wirklich machen
    möchtest. Nur so wird es möglich einen konkreten Lösungsweg
    vorzuschlagen.

    Schau Dir mal das nachfolgende Beispiel, bei dem via Buttonklick
    neue Textboxen erstellt bzw. wieder entfernt werden. Ein Zeichnen
    mit Graphikmethoden im Paintereignis kommt darin nicht vor.

    Kopiere den nachfolgenden Code einfach in ein
    leeres Formmodul (Form1.vb).

    ' / / / Beginn Code Form1.vb
    Public Class Form1
        Private WithEvents Button1 As Button
        Private WithEvents Button2 As Button
        Private Panel1 As Panel

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

            Init()
        End Sub

        Private Sub Init()

            Panel1 = New Panel
            With Panel1
                .Name = "Panel1"

                .SetBounds _
                        (10, 10, _
                         Me.ClientSize.Width - 20, _
                         50)

                .Anchor = _
                        AnchorStyles.Left Or _
                        AnchorStyles.Top Or _
                        AnchorStyles.Right

                .BorderStyle = BorderStyle.Fixed3D
            End With
            Me.Controls.Add(Panel1)

            Button1 = New Button
            With Button1
                .Name = "Button1"
                .Font = New Font("Arial", 8)
                .Text = "Add Textbox"

                .SetBounds _
                        (10, Panel1.Bottom + 15, _
                         120, 36)

                .Anchor = _
                        AnchorStyles.Left Or _
                        AnchorStyles.Top

            End With
            Me.Controls.Add(Button1)

            Button2 = New Button
            With Button2
                .Name = "Button2"
                .Font = Button1.Font
                .Text = "Remove Textbox"

                .SetBounds _
                        (Button1.Right + 2, _
                         Button1.Top, _
                         Button1.Width, _
                         Button1.Height)

                .Anchor = Button1.Anchor
            End With
            Me.Controls.Add(Button2)

            Me.ClientSize = _
                    New Size _
                    (500, Button1.Bottom + 15)

            Me.MinimumSize = _
                    New Size(200, Me.Height)

            Me.MaximumSize = _
                    New Size _
                    (Screen.GetWorkingArea(Me).Width, _
                     Me.Height)
        End Sub

        Private Sub Button1_Click _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles Button1.Click

            Dim L As Integer

            Dim Idx As Integer = _
                Panel1.Controls.Count + 1

            If Idx < 2 Then
                L = 5
            Else
                L = _
                    Panel1.Controls _
                    ("TextBox" & (Idx - 1).ToString).Right + 3
            End If

            Dim TB As New TextBox
            With TB
                .Name = "Textbox" & Idx.ToString
                .Font = New Font("Arial", 12)
                .Width = 80
                .Text = .Name

                .Location = _
                        New Point _
                        (L, (Panel1.Height - .Height) \ 2)

            End With
            Panel1.Controls.Add(TB)

            AddHandler _
                    TB.TextChanged, _
                    AddressOf TextBox_TextChanged

            AddHandler _
                    TB.Enter, _
                    AddressOf TextBox_Enter

            ' ... weitere Eventhandler für diese Textbox hinzufügen....
        End Sub

        Private Sub Button2_Click _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles Button2.Click

            If Panel1.Controls.Count > 0 Then
                Dim TB As TextBox
                Dim Idx As Integer = Panel1.Controls.Count

                TB = _
                    DirectCast _
                        (Panel1.Controls("Textbox" & Idx.ToString),  _
                        TextBox)

                RemoveHandler _
                        TB.TextChanged, _
                        AddressOf TextBox_TextChanged

                RemoveHandler _
                        TB.Enter, _
                        AddressOf TextBox_Enter

                ' weitere Eventhandler für diese Textbox entfernen

                Panel1.Controls.Remove(TB)
            End If
        End Sub

        Private Sub TextBox_TextChanged _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs)

            Dim TB As TextBox = DirectCast(sender, TextBox)
            Me.Text = TB.Name & ": " & TB.Text
        End Sub

        Private Sub TextBox_Enter _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs)

            Dim TB As TextBox = DirectCast(sender, TextBox)
            Me.Text = TB.Name & " entered"
        End Sub

    End Class
    ' \ \ \  E N T E

    Nach dem Programmstart siehst Du die Form1 mit einem (noch)
    leeren Panel (Panel1) sowie zwei Buttons (Add Textbox u.
    Remove Textbox).
    Mit einem Klick auf den Button "Add Textbox" wird eine neue
    Textbox (mit zugehörigen Eventhandlern) im Panel hinzugefügt.
    Mit einem Klick auf den Button "Remove Textbox" wird die
    jeweils letzte Textbox (mit zugehörigen Eventhandlern) entfernt.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Montag, 25. Oktober 2010 13:02
  • Hallo Peter,

    ich klinke mich hier jetzt aus und überlasse Dir jeanny. Ich habe mein Codesample 2 noch überarbeitet. Jetzt ist klar, wie man Text malt wie in Paint. Das war ja die frage.

    schöne Grüße Ellen

     


    Ich benutze/ I'm using VB2008 & VB2010
    Montag, 25. Oktober 2010 14:15
  • Hallo Ellen,

    ich klinke mich hier jetzt aus und überlasse Dir jeanny.
    Ich habe mein Codesample 2 noch überarbeitet.
    Jetzt ist klar, wie man Text malt wie in Paint. Das war
    ja die frage.

    Ich lese da was anderes, nämlich:

        * Zitat *
           ich möchte gern zur Laufzeit in einer Form auf einen
            Panel ein Textfeld zeichnen, wo ich dann ein Text
            eingeben kann
        * Zitat Ende *

    Es soll nicht Text gemalt werden, sondern es soll zur Laufzeit eine
    TextBox (Textfeld) auf einem Panel erstellt werden. In diese
    Textbox soll man (man dürfte der spätere Benutzer der Anwendung
    sein) Text eingeben können.

    Das Erstellen der Textbox(en) kann wie in meinem Beispiel aus
    dem vorigen Posting erfolgen.

    Das Verschieben der Textbox(en) kann wie im Beispiel unter

        www.gssg.de -> Visual Basic -> VB.net
            -> Sonstige
                -> Move Control

    realisiert werden.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Montag, 25. Oktober 2010 16:49
  • Hallo Peter Götz

    ist dann das nicht auch ein Textfeld wenn ich jetzt wie in Paint Text hinzufügen gehe ich auf das Textbutton klicke in das und trage dort einen Text ein.

    Es soll ja quasi eine Unterstützung sein wenn man eine Story schreibt dann zu wissen was an gewissen orten passiert, zu dem soll das was im Storyboard gezeichnet wird irgendwie in einer Datenbank gespeichert werden damit es erhalten bleibt.

     

    Oder habe ich irgendwo ein Denkfehler?

     

    LG

    jeanny26

    Montag, 25. Oktober 2010 17:05
  • Hallo,

    ist dann das nicht auch ein Textfeld wenn ich jetzt wie in Paint

    Ich rate jetzt mal dass Du mit "Paint" das Malprogramm Paint
    meinst.

    Text hinzufügen gehe ich auf das Textbutton klicke in das und
    trage dort einen Text ein.

    In Paint wird dabei letztlich auch eine Textbox, ähnlich wie im
    Code aus meinem Beispiel erzeugt, in die man dann eben
    Text eingeben kann.

    Es soll ja quasi eine Unterstützung sein wenn man eine Story schreibt

    Was genau meinst Du mit "Story schreibt"?

    dann zu wissen was an gewissen orten passiert,

    Was soll / kann an welchen gewissen Orten passsieren?

    zu dem soll das was im Storyboard gezeichnet wird
     irgendwie in einer Datenbank gespeichert werden damit
    es erhalten bleibt.

    Natürlich könnte man mit Methoden des Graphics-Objektes
    irgendwelchen Text malen und diesen dann als Graphik irgendwo
    speichern. Sonderlich effektiv wäre das aber wohl kaum, denn es
    soll doch offenbar schlicht und einfach irgendwelcher Text, der
    vom Benutzer in einer Textbox eingegeben wurde, gespeichert
    werden.
    Da ist es doch deutlich einfacher eben diese Textbox(en) entsprechend
    bereitzustellen (z.B. indem man sie zur Laufzeit erzeugt) und dann den
    vom Benutzer dort eingegebenen Text auszulesen und in einer Datenbank
    zu speichern. Ein solcher Text benötigt nur wenige Bytes an Speicherplatz,
    Graphiken können da schon deutlich umfangreicher werden und würden,
    sofern sie nur Texte darstellen trotz des hohen Speicherbedarfs auch nicht
    mehr Information bieten.

    Oder habe ich irgendwo ein Denkfehler?

    Ich denke schon.

    Hast Du mein Beispiel denn mal ausprobiert?
    Wenn ja, dann sollte eigentlich schon der gewünschte Aha-Effekt
    eintreten.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Montag, 25. Oktober 2010 17:24
  • ist dann das nicht auch ein Textfeld wenn ich jetzt wie in Paint Text hinzufügen gehe ich auf das Textbutton klicke in das und trage dort einen Text ein.

     

    Hallo,

    grundsätzlich habe einge Leute damit massive Probleme, zu verstehen was dort passiert. Bei Paint ist das einfach. Irgendwo "malt" Paint seine Grafik. Ob das ein Panel, UserControl oder eine selbsterstelltes Control ist(also einfach von Control abgeleitet ist) spielt dabei keine Rolle. Wichtig ist halt dass es ein Graphics-Objekt für diesen Device-Context erstellen kann und das geht bei allen von Control abgeleiteten Klassen. Ich hoffe Du weißt annährend was Vererbung ist. Schaust Du hier:

    Public Class MyPaint
    	Inherits Control
    
    End Class
    
    

    Ich habe eine einfache Klasse erstellt, die von Control abgeleitet(beerbt) wurde. Das ist Inherits-Anweisung. DIe Basis-Klasse ist hier vom Typ Control und diese stellt schon einige Methoden bereit, die man sich zum Nutzen machen kann, hier vorangig die OnPaint-Methode.

    Public Class MyPaint
    	Inherits Control
    
    	Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    		MyBase.OnPaint(e)
    	End Sub
    End Class
    
    

    Nachdem Du Protected Overrides Sub OnPaint eigeben hast und die Return-Taste betätigst wird die Methode wie oben eingefügt. Hierzu sollte Dir nun auffallen, dass die Methode einen Parameter erhält und zwar e. Dazu gleich mehr. Desweitern siehst Du das die Anweisung MyBase.OnPaint(e) eingefügt wurde. Um jetzt genau zu erklären washinter der Anweisung steckt, sprengst es sicherlich den Rahmen, daher möchte ich bei dem Parameter e bleiben.e ist vom Typ PaintEventArgs und dieser besitzt sehr viele nützliche Eigenschaften und anderem eine Eigenschaft die nennt sich Graphics, ergo e.Graphics. Graphics wiederum besitzt Methoden wie DrawLine, DrawString, DrawImage etc. Jedes mal wenn OnPaint aufgerufen, und das passiert wenn zumindest ein Teil des Controls neugezeichnet werden muss, wird wird e neu erstellt. Wolltest Du jetzt eine Linie zeichnen, dann würde das so aussehen:

    Public Class MyPaint
    	Inherits Control
    
    	Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    		MyBase.OnPaint(e)
    		e.Graphics.DrawLine(Pens.Red, 10, 10, 100, 50)
    	End Sub
    End Class
    
    

    So weit, wie man etwas auf einen Device-Context bekommt(das kann übrigens auch ein Drucker oder sonst was sein).

    Damit Du die Klasse überhaupt benutzen kannst musst Du natürlich auch eine Instanz der Klasse in Deiner Anwendung erstellen, besser in Deinem Formular(oder Container, da diese ja auch anderen Controls zugeordnet werden können).

    Public Class Form1
    
    	Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    		Dim myPaint As New MyPaint
    		myPaint.Parent = Me
    	End Sub
    End Class
    
    

    Natürlich sollte man hier noch die Größe und Position festlegen. Da das aber nicht das Einzige ist, belasse ich erst mal dabei.

    Was jetzt auffällt, ist das ganze doch sehr statisch ist, immerhin habe ich die Linie im Control "hart-auskodiert", sowas kann man "von aussen" nicht ändern. Um dem abzubehelfen braucht man eine sogenannte "DrawingList". In dieser steht dann wo etwas wie gezeichnet werden soll. Man übergibt diese Listedann dem Contol und es zeichnet dann die gewünschten Elemente. Das können aber auch einfache Eigenschaften sein wie bspw. die Spaltenbreite und Zeilenhöhe einer Tabelle. Kombiniert mit der Spalten- und Zeilenanzahl zeichnet dann das Control dann die Tabelle. Schaust Du hier:

    Public Class Form1
    
    	Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    		Dim myPaint As New MyPaint
    		myPaint.Parent = Me
    		myPaint.Dock = DockStyle.Fill
    	End Sub
    End Class
    
    Public Class MyPaint
    	Inherits Control
    	Private _ColumnWidth As Integer = 100
    	Private _RowHeight As Integer = 20
    	Private _ColumnCount As Integer = 10
    	Private _RowCount As Integer = 8
    
    	Public Property ColumnWidth() As Integer
    		Get
    			Return _ColumnWidth
    		End Get
    		Set(ByVal value As Integer)
    			If _ColumnWidth <> value Then
    				_ColumnWidth = value
    				Me.Invalidate()
    			End If
    		End Set
    	End Property
    	Public Property RowHeight() As Integer
    		Get
    			Return _RowHeight
    		End Get
    		Set(ByVal value As Integer)
    			If _RowHeight <> value Then
    				_RowHeight = value
    				Me.Invalidate()
    			End If
    		End Set
    	End Property
    	Public Property ColumnCount() As Integer
    		Get
    			Return _ColumnCount
    		End Get
    		Set(ByVal value As Integer)
    			If _ColumnCount <> value Then
    				_ColumnCount = value
    				Me.Invalidate()
    			End If
    		End Set
    	End Property
    	Public Property RowCount() As Integer
    		Get
    			Return _RowCount
    		End Get
    		Set(ByVal value As Integer)
    			If _RowCount <> value Then
    				_RowCount = value
    				Me.Invalidate()
    			End If
    		End Set
    	End Property
    
    	Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    		MyBase.OnPaint(e)
    		For col = 0 To ColumnCount
    			e.Graphics.DrawLine(Pens.Black, col * _ColumnWidth, 0, col * _ColumnWidth, _RowHeight * _RowCount)
    		Next
    		For row = 0 To _RowCount
    			e.Graphics.DrawLine(Pens.Black, 0, row * _RowHeight, _ColumnWidth * _ColumnCount, row * _RowHeight)
    		Next
    	End Sub
    End Class
    

    Nun werfeein Blick auf dei Eigenschaften die ich der Klasse hinzugefügt hab, derzeit sind sie mit Standartwerten initialisiert. Wenn Du Diese Werte nun änderst kommt bspw. folgender Code ins Spiel:

    		Set(ByVal value As Integer)
    			If _RowCount <> value Then
    				_RowCount = value
    				Me.Invalidate()
    			End If
    		End Set
    
    

    Hier wird die Zuweisung nur angenommen, wenn sich der Wert auch wirklich geändert hat. Zudem wird die Methode Invalidate aufgerufen, sie sorgt dafür dass das Control sich selber neu zeichnet(Invaidate hat noch Überladungen doch auch das führt hier zu weit).

    Nun so weit so gut, doch was hat das mit der Eingabe zu tun? Hier hast Du es mit eine einfachen Tabelle zu tun. In meinen Beispiel 10 Spalten und 8 Zeilen. Du kannst aber mittels des der Breite einer Spalte und der Höhe einer Zeile und der Mausposition errechnen in welcher Spalte und Zeile Du Dich befindest. Nehmenwir nun an das Deine Datenquelle aus einem Array von Spalten und Zeilen besteht, so kannst Du genau ermitteln was in dieser Zelle steht. Du kannst aber noch etwas. Und zwar die Position der zelle und des Größe ermitteln.

    Und genau jetzt kommt die Textbox: Hierzu nutzt Du die Standard-TextBox. Die Größe passt Du Deiner ermittelten Zellengröße an und blendest sie genau an der Stelle ein, wo Deine Zelle ist und "fütterst" sie mit dem Array-Inhalt. Nun kannst Du den Wert editieren und wieder zurück in das Array speichern. Du brauchst nur diese eine TextBox. Das Control besteht also nur aus sich selber und eine TextBox. Genau dieses Prinzip wird in allen Controls benutzt, u.a. auch in Paint man muss nur wissen wohin undvoher die Daten müssen und kommen.

    Entschuldige, dass ich das hier abrupt beende, aber ich habe heute noch kein Abrendbrot gehabt und mir knurrt der Magen.

    Ich zeige Dir gerne wie es weiter geht, aber nicht heute.

    --

    Gruß Scotty

     

    Mittwoch, 27. Oktober 2010 18:51
  • Hallo Ellen,

    Ich lese da was anderes, nämlich:

        * Zitat *
           ich möchte gern zur Laufzeit in einer Form auf einen
            Panel ein Textfeld zeichnen, wo ich dann ein Text
            eingeben kann
        * Zitat Ende *

    Es soll nicht Text gemalt werden, sondern es soll zur Laufzeit eine
    TextBox (Textfeld) auf einem Panel erstellt werden. In diese
    Textbox soll man (man dürfte der spätere Benutzer der Anwendung
    sein) Text eingeben können.


     

    Hallo Peter,

    Ja du hast Recht. Die Aufgabenstelluing von jeanny23 war: Text zeichnen wie in paint. Das habe ich gezeigt. Ich lasse meinen Code so stehen.  

    Gruß Ellen

     


    Ich benutze/ I'm using VB2008 & VB2010
    Mittwoch, 27. Oktober 2010 19:31