我有一个PictureBox
添加到我的Panel1
与Panel1.Controls.Add(pb)
,我试图让我的.png
图片透明。
我尝试过使用Color.Transparent
和System.Drawing.Color.Transparent
,但是当我将PictureBox
添加到我的Panel
时,我无法让它变得透明。
而且我也无法将其他图像带到前面。
这是我的代码。
Private Function molduraint()
Dim pb As New PictureBox
pb.BringToFront()
pb.ImageLocation = OpenFileDialog1.FileName
pb.SizeMode = PictureBoxSizeMode.StretchImage
Panel1.Controls.Add(pb)
pb.Location = New Point(txtValueX.Text, txtValueY.Text)
If txtValueX.Text = 0 Or txtValueY.Text = 0 Then
pb.Location = New Point(300, 172)
End If
pb.Visible = True
pb.Size = New Size(TrackBar1.Value, TrackBar2.Value)
pb.Image = PictureBox1.Image
End Function
正如您可能知道的那样,WinForms
控件并非完全旨在支持真正的透明度(除了Forms
,它们实际上可以是透明的)。
另一方面,Bitmaps
支持透明度。
如果使用支持Alpha通道的图像格式创建Bitmap
对象(如.png
位图),则可以绘制该图像以保持其透明度。
首先要做的是创建一个可以用来引用我们想要绘制的每个Bitmap
的对象,这样我们就可以跟踪它们。
由于您希望能够指定这些对象的位置和大小,因此这些对象必须具有两个属性。我在这里添加一些可能有用的东西。
Public Class BitmapObject
Public Property Name As String
Public Property Image As Bitmap
Public Property Position As Point
Public Property Size As Size
Public Property Order As Integer
End Class
Name
属性将是源文件的名称,Order
将引用Bitmap
相对于容器内绘制的其他Bitmaps
的z顺序位置。
所有Bitmaps
都将使用Bitmap
对象列表进行分组,因此我们可以使用List Index或其中一个属性来召唤它们。
Public MyBitmaps As List(Of BitmapObject) = New List(Of BitmapObject)
至于绘图表面(画布),我们可以使用Form
本身,PictureBox
或Panel
(因为它们 - 或多或少 - 只是表面)。我更喜欢Panel
,它重量轻,它可以容纳其他控件,如果需要可以移动。
如果你想绘制一个控件,你只需要订阅它的Paint()
事件并提升它调用控件的Invalidate()
方法。
Private Sub Panel1_Paint(sender As Object, e As PaintEventArgs) Handles Panel1.Paint
If MyBitmaps.Count > 0 Then
MyBitmaps.OrderBy(Function(item) item.Order).
Select(Function(item)
e.Graphics.DrawImage(item.Image, New Rectangle(item.Position, item.Size))
Return item
End Function).ToList()
End If
End Sub
要将Bitmap
添加到List(Of BitmapObject)
,因为您要使用OpenFileDialog
让用户选择Bitmap
,我们将此功能分配给Button
,当选择Bitmap
时,会创建一个新的BitmapObject
并附加到List。
Private Sub btnOpenFile_Click(sender As Object, e As EventArgs) Handles btnOpenFile.Click
Dim fd As OpenFileDialog = New OpenFileDialog()
fd.InitialDirectory = "[Images Path]"
Dim dr As DialogResult = fd.ShowDialog()
If dr = Windows.Forms.DialogResult.OK Then
Dim BitmapName As String = New FileInfo(fd.FileName).Name
Using tmpBitmap As Bitmap = New Bitmap(fd.FileName)
MyBitmaps.Add(New BitmapObject With {
.Image = New Bitmap(tmpBitmap),
.Position = New Point(Integer.Parse(TextBox1.Text), Integer.Parse(TextBox2.Text)),
.Size = New Size(tmpBitmap.Height, tmpBitmap.Width),
.Order = MyBitmaps.Count,
.Name = BitmapName})
ComboBox1.Items.Add(BitmapName)
ComboBox1.SelectedIndex = MyBitmaps.Count - 1
TrackBar1.Value = tmpBitmap.Height
TrackBar2.Value = tmpBitmap.Width
Panel1.Invalidate()
End Using
End If
End Sub
这是结果:(Full source code in PasteBin)