VB.NET 在不同位置将多个图像绘制到 PictureBox 上
VB.NET Drawing Multiple Images onto a PictureBox at Different Locations
我在 PictureBox
中有一张图片,我还有其他几张图片要绘制到 PictureBox
的不同位置。
例如,我有几张图片想绘制到 PictureBox
内的图片上,例如这两个星星(都是具有透明背景的单张图片 (PNG)):
我想在不同的位置绘制多个不同的星星,如下图所示。 (美国地图是 PictureBox
.
中已经存在的图像
我正在尝试编写一个函数,当 supplied/given PictureBox
的 x
和 y
值的 Point
变量和图像的位置(例如 My.Resources.RedCity
或 My.Resources.BlueCity
)会将多个图像绘制到 PictureBox
.
到目前为止,我已经完成了在 picturebox
上绘制 ONE 图片,但是我无法在 PictureBox
上绘制多张图片一次在不同的位置,因为当我使图像无效时另一图像消失。
我正在考虑编写一个类似这样的函数来将 Picture/Point 添加到某个列表或其他内容,并在 PictureBox
的 paint
事件下添加一些内容,但我'我不确定它是如何工作的。
是否存在或可以编写任何函数,可以将多个图像同时绘制到不同位置的 PictureBox
上?
谢谢..
I was thinking of writing a function something like this to add a
Picture/Point to some list or something and having something under the
PictureBox's paint event, but I'm not sure how it would work for this.
这才是正确的做法。简单例子:
Public Class Form1
Private dataPoints As New List(Of Tuple(Of Point, Integer))
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
dataPoints.Add(Tuple.Create(New Point(nudX.Value, nudY.Value), If(cbBlue.Checked, 0, 1)))
PictureBox1.Invalidate()
End Sub
Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
Dim G As Graphics = e.Graphics
For Each dataPoint In dataPoints
Dim img As Image = If(dataPoint.Item2 = 0, My.Resources.BlueCity, My.Resources.RedCity)
G.DrawImage(img, dataPoint.Item1)
Next
End Sub
End Class
我会将地图加载到图形环境中,然后在其上绘制。
下面举例说明如何画一个字符串(可以在地图上旋转),gr.DrawString(,0,0)末尾的两个零放置字符串在左上角)。 FromImage(bmp) 是加载美国地图的地方,只需使用地图的文件地址将bmp 导入文件路径,或将其添加到资源中。我会添加来自 Wingding 字体的彩色星星和圆圈,它们具有不同形状的字符,您只需要更改它们的颜色即可。我提供了字体大小,所以你必须玩它。
Dim bmp As New Bitmap(500, 15)
Dim gr As Graphics = Graphics.FromImage(bmp)
gr.SmoothingMode = SmoothingMode.HighQuality
gr.InterpolationMode = InterpolationMode.HighQualityBicubic
gr.PixelOffsetMode = PixelOffsetMode.HighQuality
gr.TextRenderingHint = TextRenderingHint.ClearTypeGridFit
gr.SmoothingMode = SmoothingMode.AntiAlias
Dim mybrush As New SolidBrush(Color.Yellow)
Dim fontbrush As New SolidBrush(Color.Black)
fontbrush.Color = SystemColors.ControlText
mybrush.Color = SystemColors.Control
Dim sfont As New Font("Microsoft Sans Serif", 9, FontStyle.Regular)
Dim strformat As StringFormat = New StringFormat(StringFormatFlags.DirectionVertical)
strformat.Alignment = StringAlignment.Far
Dim strToDraw As String
strToDraw = "Test string"
Dim stringSize As New SizeF()
stringSize = gr.MeasureString(strToDraw, sfont)
gr.FillRectangle(mybrush, CInt(0), CInt(0), stringSize.Width, stringSize.Height)
gr.DrawString(strToDraw, sgenefont, fontbrush, 0, 0)
gr.Dispose
我在 PictureBox
中有一张图片,我还有其他几张图片要绘制到 PictureBox
的不同位置。
例如,我有几张图片想绘制到 PictureBox
内的图片上,例如这两个星星(都是具有透明背景的单张图片 (PNG)):
我想在不同的位置绘制多个不同的星星,如下图所示。 (美国地图是 PictureBox
.
我正在尝试编写一个函数,当 supplied/given PictureBox
的 x
和 y
值的 Point
变量和图像的位置(例如 My.Resources.RedCity
或 My.Resources.BlueCity
)会将多个图像绘制到 PictureBox
.
到目前为止,我已经完成了在 picturebox
上绘制 ONE 图片,但是我无法在 PictureBox
上绘制多张图片一次在不同的位置,因为当我使图像无效时另一图像消失。
我正在考虑编写一个类似这样的函数来将 Picture/Point 添加到某个列表或其他内容,并在 PictureBox
的 paint
事件下添加一些内容,但我'我不确定它是如何工作的。
是否存在或可以编写任何函数,可以将多个图像同时绘制到不同位置的 PictureBox
上?
谢谢..
I was thinking of writing a function something like this to add a Picture/Point to some list or something and having something under the PictureBox's paint event, but I'm not sure how it would work for this.
这才是正确的做法。简单例子:
Public Class Form1
Private dataPoints As New List(Of Tuple(Of Point, Integer))
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
dataPoints.Add(Tuple.Create(New Point(nudX.Value, nudY.Value), If(cbBlue.Checked, 0, 1)))
PictureBox1.Invalidate()
End Sub
Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
Dim G As Graphics = e.Graphics
For Each dataPoint In dataPoints
Dim img As Image = If(dataPoint.Item2 = 0, My.Resources.BlueCity, My.Resources.RedCity)
G.DrawImage(img, dataPoint.Item1)
Next
End Sub
End Class
我会将地图加载到图形环境中,然后在其上绘制。
下面举例说明如何画一个字符串(可以在地图上旋转),gr.DrawString(,0,0)末尾的两个零放置字符串在左上角)。 FromImage(bmp) 是加载美国地图的地方,只需使用地图的文件地址将bmp 导入文件路径,或将其添加到资源中。我会添加来自 Wingding 字体的彩色星星和圆圈,它们具有不同形状的字符,您只需要更改它们的颜色即可。我提供了字体大小,所以你必须玩它。
Dim bmp As New Bitmap(500, 15)
Dim gr As Graphics = Graphics.FromImage(bmp)
gr.SmoothingMode = SmoothingMode.HighQuality
gr.InterpolationMode = InterpolationMode.HighQualityBicubic
gr.PixelOffsetMode = PixelOffsetMode.HighQuality
gr.TextRenderingHint = TextRenderingHint.ClearTypeGridFit
gr.SmoothingMode = SmoothingMode.AntiAlias
Dim mybrush As New SolidBrush(Color.Yellow)
Dim fontbrush As New SolidBrush(Color.Black)
fontbrush.Color = SystemColors.ControlText
mybrush.Color = SystemColors.Control
Dim sfont As New Font("Microsoft Sans Serif", 9, FontStyle.Regular)
Dim strformat As StringFormat = New StringFormat(StringFormatFlags.DirectionVertical)
strformat.Alignment = StringAlignment.Far
Dim strToDraw As String
strToDraw = "Test string"
Dim stringSize As New SizeF()
stringSize = gr.MeasureString(strToDraw, sfont)
gr.FillRectangle(mybrush, CInt(0), CInt(0), stringSize.Width, stringSize.Height)
gr.DrawString(strToDraw, sgenefont, fontbrush, 0, 0)
gr.Dispose