Benutzer mit den meisten Antworten
Wie zeichne ich ein Textfeld wie in Paint?

Frage
-
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- Bearbeitet Ellen Ramcke Dienstag, 26. Oktober 2010 19:22
- Als Antwort vorgeschlagen Ellen Ramcke Dienstag, 26. Oktober 2010 20:22
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 5. November 2010 08:49
-
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- Als Antwort vorgeschlagen Ellen Ramcke Dienstag, 26. Oktober 2010 20:21
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 5. November 2010 08:49
-
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 PanelPrivate Sub Form1_Load _
(ByVal sender As System.Object, _
ByVal e As System.EventArgs _
) Handles MyBase.LoadInit()
End SubPrivate 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.TopEnd 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 SubPrivate Sub Button1_Click _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles Button1.ClickDim L As Integer
Dim Idx As Integer = _
Panel1.Controls.Count + 1If Idx < 2 Then
L = 5
Else
L = _
Panel1.Controls _
("TextBox" & (Idx - 1).ToString).Right + 3
End IfDim 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_TextChangedAddHandler _
TB.Enter, _
AddressOf TextBox_Enter' ... weitere Eventhandler für diese Textbox hinzufügen....
End SubPrivate Sub Button2_Click _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles Button2.ClickIf Panel1.Controls.Count > 0 Then
Dim TB As TextBox
Dim Idx As Integer = Panel1.Controls.CountTB = _
DirectCast _
(Panel1.Controls("Textbox" & Idx.ToString), _
TextBox)RemoveHandler _
TB.TextChanged, _
AddressOf TextBox_TextChangedRemoveHandler _
TB.Enter, _
AddressOf TextBox_Enter' weitere Eventhandler für diese Textbox entfernen
Panel1.Controls.Remove(TB)
End If
End SubPrivate 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 SubPrivate 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 SubEnd Class
' \ \ \ E N T ENach 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)- Als Antwort markiert Robert BreitenhoferModerator Freitag, 5. November 2010 08:49
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 -
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;813808Hosting Windows Forms Designers
http://divil.co.uk/net/articles/designers/hosting.aspBeste Grüße,
Herfried
Herfried K. Wagner [MVP] -
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
-
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- Als Antwort vorgeschlagen Ellen Ramcke Dienstag, 26. Oktober 2010 20:21
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 5. November 2010 08:49
-
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- Bearbeitet Ellen Ramcke Dienstag, 26. Oktober 2010 19:22
- Als Antwort vorgeschlagen Ellen Ramcke Dienstag, 26. Oktober 2010 20:22
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 5. November 2010 08:49
-
Hallo,
ich möchte gern zur Laufzeit in einer Form auf einen Panel
ein Textfeld zeichnen, wo ich dann ein Text eingeben kannEin 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 TextBox1Du 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
unterwww.gssg.de -> Visual Basic -> VB.net
-> Sonstige
-> Move ControlGruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen) -
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 -
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 PanelPrivate Sub Form1_Load _
(ByVal sender As System.Object, _
ByVal e As System.EventArgs _
) Handles MyBase.LoadInit()
End SubPrivate 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.TopEnd 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 SubPrivate Sub Button1_Click _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles Button1.ClickDim L As Integer
Dim Idx As Integer = _
Panel1.Controls.Count + 1If Idx < 2 Then
L = 5
Else
L = _
Panel1.Controls _
("TextBox" & (Idx - 1).ToString).Right + 3
End IfDim 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_TextChangedAddHandler _
TB.Enter, _
AddressOf TextBox_Enter' ... weitere Eventhandler für diese Textbox hinzufügen....
End SubPrivate Sub Button2_Click _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles Button2.ClickIf Panel1.Controls.Count > 0 Then
Dim TB As TextBox
Dim Idx As Integer = Panel1.Controls.CountTB = _
DirectCast _
(Panel1.Controls("Textbox" & Idx.ToString), _
TextBox)RemoveHandler _
TB.TextChanged, _
AddressOf TextBox_TextChangedRemoveHandler _
TB.Enter, _
AddressOf TextBox_Enter' weitere Eventhandler für diese Textbox entfernen
Panel1.Controls.Remove(TB)
End If
End SubPrivate 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 SubPrivate 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 SubEnd Class
' \ \ \ E N T ENach 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)- Als Antwort markiert Robert BreitenhoferModerator Freitag, 5. November 2010 08:49
-
-
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 Controlrealisiert werden.
Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen) -
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
-
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) -
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
-
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