| |
VB.NET - Ein- und UmsteigerLinie zeichnen mit zentrierter Beschriftung | | | Autor: mullfreak | Datum: 24.09.08 08:45 |
| Hallo,
ich will eine Linie zeichnen an der zentriert ein Buchstabe steht.
Linie zeichnen ist kein Thema. DrawString ist kein Thema.
Nur wie kann ich beides verbinden?
Gruß und danke.
Mull 0 | |
Re: Linie zeichnen mit zentrierter Beschriftung | | | Autor: bauer | Datum: 24.09.08 09:47 |
| Aus den beiden Endpunkten läßt sich der Mittelpunkt der Linie berechnen. Hier muss der Text ansetzen.
Stellt sich nur noch die Frage, ob der Text immer waagerecht an der Linien steht oder z.B. bei schrägen Linien der Text gedreht hin muss, genauer: Die Steigung / Drehwinkel der Linie haben soll.
Danach richtet sich dann, ob zuvor evtl. noch eine Rotation vom Koordinatensystem notwendig ist. | |
Re: Linie zeichnen mit zentrierter Beschriftung | | | Autor: mullfreak | Datum: 24.09.08 10:14 |
| Hallo bauer,
vielen Dank für den Hinweis. Bis jetzt hab ich leider noch keine Ahnung wie ich das machen soll. Ich google jetzt mal rum, wird sich schon was finden.
Die Rotation des Koordinatensystems wäre kein Problem. Das hab ich schon mal gemacht.
Gruß
Mull 0 | |
Re: Linie zeichnen mit zentrierter Beschriftung | | | Autor: bauer | Datum: 24.09.08 10:33 |
| Sofern die Steigung der Geraden sich nicht auf den Text vererben soll, dann in etwa wie folgt.
Sofern der Text quasi parallel zur Geraden stehen soll, dann Steigung ausrechen der Geraden und als Drehwinkel in eine Koordinatentransformaation vor dem Stringzeichnen reinstecken.
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles Me.Paint
LinieMitText(e.Graphics, New Point(10, 10), New Point(220, 410))
End Sub
''' <summary>
''' Text steht direkt auf der Linienmitte, zentriert auf beiden Achsen,
' nicht gedreht um Liniensteigung
''' </summary>
''' <param name="pGR"></param>
''' <param name="pP1"></param>
''' <param name="pP2"></param>
''' <remarks></remarks>
Private Sub LinieMitText(ByVal pGR As Graphics, ByVal pP1 As Point, ByVal _
pP2 As Point)
Dim l_TextAnsatzStelle As New Point
Dim l_SF As New StringFormat
If pP1.X < pP2.X Then
l_TextAnsatzStelle.X = pP1.X + 0.5 * (pP2.X - pP1.X)
Else
l_TextAnsatzStelle.X = pP2.X + 0.5 * (pP1.X - pP2.X)
End If
If pP1.Y < pP2.Y Then
l_TextAnsatzStelle.Y = pP1.Y + 0.5 * (pP2.Y - pP1.Y)
Else
l_TextAnsatzStelle.Y = pP2.Y + 0.5 * (pP1.Y - pP2.Y)
End If
l_SF.LineAlignment = StringAlignment.Center
l_SF.Alignment = StringAlignment.Center
pGR.DrawLine(Pens.Black, pP1, pP2)
pGR.DrawString("Hugo", New Font("Arial", 12), Brushes.Blue, _
l_TextAnsatzStelle, l_SF)
End Sub | |
Re: Linie zeichnen mit zentrierter Beschriftung | | | Autor: mullfreak | Datum: 24.09.08 10:46 |
| Hi,
super! Vielen Dank. Jetzt fehlt noch die Umsetzung auf meinen Code. Ich habe hier ein Dreieck gezeichnet, dass sich mit "MouseMove" bewegen lässt. Nun will ich alle drei Schenkel beschriften mit "a", "b" und "c". Die Schrift soll immer zentriert sein, wenn das Dreieck bewegt wird.
Hier mal mein Code, das Dreieck ist gezeichnet und es ist beweglich:
Public Class Form1
Private Sub Form1_Click(ByVal sender As Object, ByVal e As _
System.EventArgs) Handles Me.Click
Invalidate()
End Sub
Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As _
System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
Dim g As Graphics = CreateGraphics()
Dim p As Pen = New Pen(BackColor, 0)
g.Clear(BackColor)
Dim ptMitte As New PointF(CSng(ClientSize.Width / 2), CSng( _
ClientSize.Height / 2))
Static ptmaus As New PointF
Dim br As New SolidBrush(Color.Black)
Dim fn As New Font("Arial", 10)
' Löschen
'g.DrawLine(p, ptMitte, ptmaus)
' Lote
g.DrawLine(p, ptmaus, New PointF(ptmaus.X, ptMitte.Y))
g.DrawLine(p, ptMitte, New PointF(ptmaus.X, ptMitte.Y))
' Sichtbar zeichnen
ptmaus.X = CSng(e.X)
ptmaus.Y = CSng(e.Y)
p.Color = Color.Black
g.DrawLine(p, ptMitte, ptmaus)
' Lote
p.Color = Color.Black
g.DrawLine(p, ptmaus, New PointF(ptmaus.X, ptMitte.Y))
g.DrawLine(p, ptMitte, New PointF(ptmaus.X, ptMitte.Y))
'g.DrawString("a", fn, br, 0, 10)
'g.DrawString("b", fn, br, 0, 40)
'g.DrawString("c", fn, br, 0, 50)
End Sub
End Class Gruß
Markus 0 | |
Re: Linie zeichnen mit zentrierter Beschriftung | | | Autor: bauer | Datum: 24.09.08 11:09 |
| Wie wäre es dann so?
(abgesehen davon, daß es als Alternative zu Dim g As Graphics = CreateGraphics() bessere Wege gibt)
Public Class Form1
Private Sub Form1_Click(ByVal sender As Object, ByVal e As _
System.EventArgs) Handles Me.Click
Invalidate()
End Sub
Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As _
System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
Dim g As Graphics = CreateGraphics()
Dim p As Pen = New Pen(BackColor, 0)
g.Clear(BackColor)
Dim ptMitte As New PointF(CSng(ClientSize.Width / 2), CSng( _
ClientSize.Height / 2))
Static ptmaus As New PointF
Dim br As New SolidBrush(Color.Black)
Dim fn As New Font("Arial", 10)
' Löschen
'g.DrawLine(p, ptMitte, ptmaus)
' Lote
g.DrawLine(p, ptmaus, New PointF(ptmaus.X, ptMitte.Y))
g.DrawLine(p, ptMitte, New PointF(ptmaus.X, ptMitte.Y))
' Sichtbar zeichnen
ptmaus.X = CSng(e.X)
ptmaus.Y = CSng(e.Y)
p.Color = Color.Black
g.DrawLine(p, ptMitte, ptmaus)
' Lote
p.Color = Color.Black
g.DrawLine(p, ptmaus, New PointF(ptmaus.X, ptMitte.Y))
g.DrawLine(p, ptMitte, New PointF(ptmaus.X, ptMitte.Y))
'g.DrawString("a", fn, br, 0, 10)
'g.DrawString("b", fn, br, 0, 40)
'g.DrawString("c", fn, br, 0, 50)
LinieMitText(g, "a", ptMitte, ptmaus)
LinieMitText(g, "b", ptmaus, New PointF(ptmaus.X, ptMitte.Y))
LinieMitText(g, "c", ptMitte, New PointF(ptmaus.X, ptMitte.Y))
End Sub
''' <summary>
''' Text steht direkt auf der Linienmitte, zentriert auf beiden Achsen,
' nicht gedreht um Liniensteigung
''' </summary>
''' <param name="pGR"></param>
''' <param name="pP1"></param>
''' <param name="pP2"></param>
''' <remarks></remarks>
Private Sub LinieMitText(ByVal pGR As Graphics, ByVal pText As String, _
ByVal pP1 As PointF, ByVal pP2 As PointF)
Dim l_TextAnsatzStelle As New Point
Dim l_SF As New StringFormat
If pP1.X < pP2.X Then
l_TextAnsatzStelle.X = pP1.X + 0.5 * (pP2.X - pP1.X)
Else
l_TextAnsatzStelle.X = pP2.X + 0.5 * (pP1.X - pP2.X)
End If
If pP1.Y < pP2.Y Then
l_TextAnsatzStelle.Y = pP1.Y + 0.5 * (pP2.Y - pP1.Y)
Else
l_TextAnsatzStelle.Y = pP2.Y + 0.5 * (pP1.Y - pP2.Y)
End If
l_SF.LineAlignment = StringAlignment.Center
l_SF.Alignment = StringAlignment.Center
pGR.DrawLine(Pens.Black, pP1, pP2)
pGR.DrawString(pText, New Font("Arial", 12), Brushes.Blue, _
l_TextAnsatzStelle, l_SF)
End Sub
End Class | |
Re: Linie zeichnen mit zentrierter Beschriftung | | | Autor: mullfreak | Datum: 24.09.08 11:28 |
| Hammermäßig!!! Super Geil!
Vielen Dank.
Gruß
Mull 0 | |
| 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 |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats Neu! sevCoolbar 3.0
Professionelle Toolbars im modernen Design!
Mit sevCoolbar erstellen Sie in wenigen Minuten ansprechende und moderne Toolbars und passen diese optimal an das Layout Ihrer Anwendung an (inkl. große Symbolbibliothek) - für VB und MS-Access Weitere Infos
|