Public Class Util2D
''' <summary>
''' Schreibt einen gedrehten String in einem skalierten und gedrehten
' Koordinatensystem
''' </summary>
''' <param name="pGR">Kontext in den zu zeichnen ist</param>
''' <param name="pText">Auszugebender Text</param>
''' <param name="pFont">Schriftfont</param>
''' <param name="pBrush">Textfarbe</param>
''' <param name="pPT">Ausgabepunkt</param>
''' <param name="pTextDocking">Position vom Text bezogen auf den
' Zeichenpunkt</param>
''' <param name="pAngle">Drehwinkel vom Text</param>
''' <param name="pScaling">Skalierungsfaktor</param>
''' <param name="pRotation">Drehwinkel vom Koordinatensystem</param>
''' <remarks></remarks>
Public Overloads Shared Sub DrawRotatedString _
(ByVal pGR As Graphics _
, ByVal pText As String _
, ByVal pFont As Font _
, ByVal pBrush As Brush _
, ByVal pPT As PointF _
, ByVal pTextDocking As TextDockingEnum _
, ByVal pAngle As Integer _
, ByVal pScaling As StyleScaling _
, ByVal pRotation As Integer _
, ByVal pFormat As System.Drawing.StringFormat _
)
'Lokale Groessen
Dim l_OldTransform As Drawing2D.Matrix = pGR.Transform
Dim l_SF As New StringFormat(pFormat)
Dim l_TextAnsatzPunkt() As PointF = {pPT}
'Stringformatierung herstellen
Select Case pTextDocking
Case TextDockingEnum.TopLeft
l_SF.LineAlignment = StringAlignment.Near
l_SF.Alignment = StringAlignment.Near
Case TextDockingEnum.TopMiddle
l_SF.LineAlignment = StringAlignment.Near
l_SF.Alignment = StringAlignment.Center
Case TextDockingEnum.TopRight
l_SF.LineAlignment = StringAlignment.Near
l_SF.Alignment = StringAlignment.Far
Case TextDockingEnum.MiddleLeft
l_SF.LineAlignment = StringAlignment.Center
l_SF.Alignment = StringAlignment.Near
Case TextDockingEnum.MiddleMiddle
l_SF.LineAlignment = StringAlignment.Center
l_SF.Alignment = StringAlignment.Center
Case TextDockingEnum.MiddleRight
l_SF.LineAlignment = StringAlignment.Center
l_SF.Alignment = StringAlignment.Far
Case TextDockingEnum.BottomLeft
l_SF.LineAlignment = StringAlignment.Far
l_SF.Alignment = StringAlignment.Near
Case TextDockingEnum.BottomMiddle
l_SF.LineAlignment = StringAlignment.Far
l_SF.Alignment = StringAlignment.Center
Case TextDockingEnum.BottomRight
l_SF.LineAlignment = StringAlignment.Far
l_SF.Alignment = StringAlignment.Far
Case TextDockingEnum._NotSet
'Platzhalter fuer unbekannten Werte
Throw New Exception("pTextDocking not set")
Case Else
'Default nehmen
End Select
'Berechne den Textansatzpunkt im evtl. Sklaierten und / oder
' gedrehten Koordinatensystem
pGR.Transform.TransformPoints(l_TextAnsatzPunkt)
'Nimm eine Skalierung vom bisherigen Koordinatensystem zurueck
l_TextAnsatzPunkt(0).X = l_TextAnsatzPunkt(0).X / pScaling.xScaling
l_TextAnsatzPunkt(0).Y = l_TextAnsatzPunkt(0).Y / pScaling.yScaling
'Nimm die bisherigen Koordinatentransformationen zurueck
'Skaliere neu
'Verschiebe den Ursprung auf den Zeichenpunkt
'Drehe die Koordinatenachsen
pGR.ResetTransform()
pGR.ScaleTransform(pScaling.xScaling, pScaling.yScaling)
pGR.TranslateTransform(l_TextAnsatzPunkt(0).X, l_TextAnsatzPunkt( _
0).Y)
pGR.RotateTransform(pRotation - pAngle)
'String ausgeben
pGR.DrawString(pText, pFont, pBrush, 0, 0, l_SF)
'Fuer Debugging den Drehpunkt anzeigen
'pGR.FillEllipse(Brushes.Pink, -3, -3, 6, 6)
'Alte Transformation wieder herstellen
pGR.Transform = l_OldTransform
'Stringformater freigeben
l_SF.Dispose()
End Sub
End Class |