Nach vielen Jahren mal wieder
Ich musste dieses Problem wieder angehen und habe es für mich endlich lösen können (allerdings mithilfe von VB Net 2015, das sicher auch in diesem Bereich gegenüber VB Net 2008 einiges Neue anzubieten hat).
Es geht darum in einer Picture Box eine Textzeile mit verschiedenen Fonts und Textgrößen so auszugeben, dass der gesamte Text auf seiner Baseline ausgerichtet wird.
Dazu dient diese Funktion: (ich habe hier ganz bewusst auf alles verzichtet, was den Code komplizieren könnte)
Public Function ybase(fo As Font, y As Single) As Integer
Dim py As Integer, fs As FontStyle = fo.Style, ff As FontFamily = _
fo.FontFamily
'den Umrechnungsfaktor von Points auf Pixel bestimmen
Dim korr As Single = fo.GetHeight() / fo.FontFamily.GetLineSpacing(fs)
'über GetCellAscent den Abstand zur Baseline bestimmen und auf Pixel
' umrechnen (*korr)
py = y - ff.GetCellAscent(fs) * korr
'bestimmt den Y-Wert der Textausgabe in Pixeln so, dass der Text auf
' Höhe seiner Baseline ausgegeben wird
Return py
End Function Die Textausgabe könnte dann z.B. so aussehen: ("inhalt" ist die Picturebox, e.X,e.Y die Mauskoordinaten für die Textausgabe also z.B. bei Inhalt_Mouseup(......)
Dim fo As New Font("Times New Roman", 20, FontStyle.Bold Or _
FontStyle.Italic)
Dim fo1 As New Font("Mistral", 80, FontStyle.Regular Or _
FontStyle.Underline)
Dim s As String = "Hallo Kallegogo"
Dim g As Graphics = inhalt.CreateGraphics()
g.PageUnit = GraphicsUnit.Pixel
Dim b As Brush = Brushes.Black
Dim py As Integer = ybase(fo, e.Y) 'Auf Baseline korrigieren
Dim py1 As Integer = ybase(fo1, e.Y)'auf Baseline korrigieren
g.DrawString(s, fo, b, New Point(0, py))
g.DrawString(s, fo1, b, New Point(200, py1))
ff.Dispose()
fo.Dispose()
fo1.Dispose() Ich hatte im Netz etliches dazu gefunden, aber überwiegend sehr komplizierten Code im Zusammenhang mit diversen Browsern und nur einen Lösungsansatz wie in der obigen Funktion, der allerdings ein falsches Ergebnis lieferte.
Dont debug, because there will allways be one more bug |