如何使用DrawRectangle和DrawString将字符完美地置于一个框中?

时间:2016-10-01 14:14:02

标签: vb.net

鉴于以下VB.Net代码示例,如何在具有完美垂直居中的框中绘制字符?如果仔细观察,有些不是垂直居中的,并且有一个很小的垂直偏移。

enter image description here

已指定LineAlignment = StringAlignment.Center,但它并不完美。也许有字体或显示属性可用于计算所需的轻微调整?如果不是.Net,那么可能在Windows API调用中?

在代码的这一行中,应用了一个偏移量,但它是通过实验确定的。我想找一个更精确的计算。

p.Offset(0, fontSize * 0.1)

我检查了.Net Font类,但是我没有看到任何可以按照描述使用的本机属性。但是,我可能不会理解在我面前的是什么。我也用谷歌搜索了一个答案,但得到的信息太多了。 https://msdn.microsoft.com/en-us/library/system.drawing.font(v=vs.110).aspx

Public Class Form1

Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    Dim g As Graphics = e.Graphics
    Dim fontSize As Integer = 24
    Dim boxSize = 30
    DrawTargetBox(g, New Point(40, 40), boxSize, "X", "Arial", fontSize)
    DrawTargetBox(g, New Point(80, 40), boxSize, "X", "Times New Roman", fontSize)
    DrawTargetBox(g, New Point(120, 40), boxSize, "X", "Courier New", fontSize)
    DrawTargetBox(g, New Point(160, 40), boxSize, "X", "Calibri", fontSize)
    DrawTargetBox(g, New Point(200, 40), boxSize, "X", "Tahoma", fontSize)
    DrawTargetBox(g, New Point(240, 40), boxSize, "X", "Comic Sans", fontSize)
End Sub

Private Sub DrawTargetBox(g As Graphics, p As Point, boxSize As Integer, boxLabelText As String, fontName As String, fontSize As Integer)
    g.DrawRectangle(New Pen(Brushes.Black, 1.0), New Rectangle(p.X - (boxSize / 2), p.Y - (boxSize / 2), boxSize, boxSize))
    Dim textVerticalOffset = (boxSize / -2) - (fontSize)
    p.Offset(0, fontSize * 0.1) 'vertical squidge to hit the center of the point/box
    Dim strFormat As New StringFormat(StringFormatFlags.NoClip)
    strFormat.Alignment = StringAlignment.Center
    strFormat.LineAlignment = StringAlignment.Center
    g.DrawString(boxLabelText, New Font(fontName, fontSize), Brushes.Black, p, strFormat)
End Sub

结束班

0 个答案:

没有答案