Как вы, наверное, знаете, WinForms
элементы управления не совсем предназначены для поддержки истинной прозрачности (за исключением Forms
, они могут быть фактически прозрачными).
Bitmaps
, с другой стороны, поддерживает прозрачность.
Если вы создаете объект 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
будет ссылаться на позицию z-порядка Bitmap
относительно других Bitmaps
, нарисованных внутри контейнера.
Все 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
, а когда 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
Это результат: ( Полный исходный код в PasteBin )