昨天做一个软件,是从VB6转到VB.NET里面。涉及到在PictureBox中绘图的问题。
在VB6中,代码是这样的,很简单的:
Sub ShowStatue(ByVal s As String)
With Picture1
.AutoRedraw = True
.Cls
.FontSize = 15
.CurrentX = (.ScaleWidth - .TextWidth("文字内容")) / 2
.CurrentY = (.ScaleHeight - .TextHeight("文字内容")) / 2
Picture1.Print s
.Refresh
.AutoRedraw = False
End With
End Sub
然而,我转到.NET中的时候就懵了。
找不到AutoRedraw有木有啊!
找不到Cls有木有啊!
找不到FontSize有木有啊!
找不到CurrentX有木有啊!
找不到CurrentY有木有啊!
找不到TextWidth有木有啊!
找不到TextHeight有木有啊!
怎么办?不能就这样罢了!我记得以前看到过vb和vb.net对比的文章,我试试百度下。
于是我找到了说明,说:
TextWidth 属性 | System.Drawing.Graphics.MeasureString 方法 |
于是我就立刻实验,力图找到替代TextWidth和TextHeight的方法,得到了如下代码:
Dim font As New Font("宋体", 12)
Dim bmp As New Bitmap(PictureBox1.Width, PictureBox1.Height)
Dim g = Graphics.FromImage(bmp)
Dim sizef As SizeF = g.MeasureString("文字内容", font)
'sizef.Height表示TextHeight的值,sizef.Width表示TextWidth的值,替代完成!
完成了获取文字输出的实际宽和高的代码之后,就需要解决文字绘制的问题了。
查阅百度上的相关资料,得出了下面的简单代码:
Dim nBrush As New SolidBrush(Color.Black)
Dim font As New Font("宋体", 12)
Dim g = PictureBox1.CreateGraphics
g.Clear(PictureBox1.BackColor)
g.DrawString("文字内容", font, nBrush,5,5)
g = Nothing
这个代码可以在PictureBox上面绘制出文字,而且反复绘制不会出现重叠,因为我这里的g.Clear(PictureBox1.BackColor)就是清空显示,并且恢复原来的颜色背景的。
但是,问题是,我如果绘制的间隔很短,很频繁的时候,这个PictureBox中的文字会不停的闪烁。
于是我又查阅了很多资料,终于完成了最后的一个版本,下面贴上完整的代码:
Sub ShowStatue(ByVal info As String)
Dim nBrush As New SolidBrush(Color.Black)
Dim font As New Font("宋体", 12)
Dim bmp As New Bitmap(PictureBox1.Width, PictureBox1.Height)
Dim g = Graphics.FromImage(bmp)
Dim left As Single
Dim top As Single
Dim sizef As SizeF = g.MeasureString(info, font)
g.Clear(PictureBox1.BackColor)
top = (PictureBox1.Height - sizef.Height) / 2
left = (PictureBox1.Width - sizef.Width) / 2
g.DrawString(info, font, nBrush, left, top)
g = PictureBox1.CreateGraphics
g.DrawImage(bmp, 0, 0)
g = Nothing
bmp = Nothing
End Sub
We Are The World,We Are The Children!
谢谢大家浏览,您的留言将是宝贵的鼓励!
Michael Jackson:It's All For Love