我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
答案 0 :(得分:2)
正如您可能知道的那样,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
个对象列表进行分组,因此我们可以使用列表索引或其中一个属性来召唤它们。
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
1}},当选择Bitmap
时,会创建一个新的BitmapObject
并将其附加到列表中。
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)