TheRuudster Ответов: 1

Как сделать программно сгенерированные метки прозрачными друг для друга VB.NET


Привет,

Я хочу сделать приложение, в котором пользователь может нарисовать электрическую установку здания. Мой план сделать это-создать метку, когда выбрана электрическая деталь.
Эта метка генерируется внутри панели, но когда я создаю две метки, например, они перекрываются, а не прозрачны друг для друга. Есть ли способ сделать эти сгенерированные метки прозрачными друг для друга?

Вот мой код для генерации метки с помощью кнопки:
(код выполняется в vb.net)

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim lbl As New Label With {
            .Visible = True,
            .Text = (++lblNum).ToString(),
            .AutoSize = True,
            .Font = New Font(System.Drawing.FontStyle.Bold, 15)
        }
        'lbl.BackColor = Color.Transparent --> doesn't work
        Panel2.Controls.Add(lbl)

        AddHandler lbl.MouseDown, AddressOf LabelMouseDown
        AddHandler lbl.MouseMove, AddressOf LabelMouseMove
        AddHandler lbl.MouseUp, AddressOf LabelMouseUp

        lblNum = lblNum + 1

    End Sub


Заранее спасибо.

Приветствия,
Руди

Что я уже пробовал:

Я попытался сделать фон этикетки прозрачным, но это, похоже, не работает. Кроме того, когда я искал эту проблему, я наткнулся на метод создания picturebox в качестве родителя метки. Я попробовал эту механику с самой меткой, но очевидно, что элемент управления не может быть родителем самого себя.

1 Ответов

Рейтинг:
8

Maciej Los

Цитата:
По умолчанию элементы управления не поддерживают прозрачные обратные цвета. Однако вы можете разрешить элементу управления иметь цвет фона, который является непрозрачным, прозрачным или частично прозрачным, используя Метод SetStyle[^] в конструкторе. То SetStyle метод класса Control позволяет задать определенные предпочтения стиля для ваших элементов управления и может быть использован для включения или отключения поддержки прозрачных обратных цветов.
NoteNote

Примечание:
Элементы управления Windows Forms не поддерживают истинную прозрачность. Фон прозрачного элемента управления Windows Forms окрашивается его родителем.

Чтобы придать вашему контролю прозрачный задний цвет

Найдите конструктор для вашего класса управления. Конструктор отображается в файле кода элемента управления. В C# конструктор-это метод с тем же именем, что и элемент управления, и без возвращаемого значения. В Visual Basic конструктор-это метод с именем New.

Вызовите метод SetStyle вашей формы в конструкторе
SetStyle(ControlStyles.SupportsTransparentBackColor, True)



Источник: Как это сделать: дайте вашему элементу управления прозрачный фон[^]


[РЕДАКТИРОВАТЬ]
Из-за SetStyle доступность (защищенный метод[^]), единственный способ создать прозрачный Control (в этом случае Label) заключается в создании пользовательского класса, который получает[^] от Control (или Label), например:
Public Class TransparentLabel
	Inherits Label
		
	Public Sub New
		Me.ForeColor = Color.Green
		Me.BorderStyle = 1 'Solid. The border is centered on the edge of the shape.
		Me.SetStyle(ControlStyles.SupportsTransparentBackColor, True)
	End Sub
 
End Class

Затем вы должны создать пользовательские элементы управления в коде:
Dim tl As TransparentLabel = New TransparentLabel()
With tl
    .Location = New System.Drawing.Point(10, 10)
    .Parent = Me 'Form
   'Set other properties here
End With


Примечание: не проверено (не хватает времени).


TheRuudster

Dim lbl As New Label With {
.Visible = True,
.Size = New System.Drawing.Size(50, 50),
.SetStyle(ControlStyles.SupportsTransparentBackColor, True),
.BackColor = Color.Transparent
}

я застрял на том, что setstyle не является свойством элемента управления label.

Не могли бы вы привести пример, пожалуйста?

Maciej Los

Пожалуйста, внимательно прочтите документацию! Это утверждение очень важно: Найдите конструктор для вашего класса управления.
Шаги, которые нужно сделать:
1. Просмотр кода вашей формы
2. в правом верхнем углу панели кода вы найдете выпадающий список (по умолчанию он отображает: "(объявления)"). Выберите Пункт "Создать". Это создаст Public Sub New в этой форме.
3. в теле приведенной выше процедуры вы найдете 3 строки кода:

' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.

4. наведите курсор мыши на InitializeComponent(), щелкните правой кнопкой мыши и выберите: Перейти К Определению (F12)- Вы будете переселены в другое место. Form.Designer.vb файл
5. Внутри Private Sub InitializeComponent() процедура вы должны изменить прозрачность для элементов управления ;)

Удачи вам!

Maciej Los

Оооо!
Я забыл, что вы создаете элементы управления в коде...
Я постараюсь привести вам рабочий пример.
Пожалуйста, наберитесь терпения.

TheRuudster

Спасибо, ха-ха, я вообще не был знаком с дизайнерским кодом, так что это приятно знать! Но всякий раз, когда вы добавляете код в конструктор, дизайн становится неработоспособным :(

Maciej Los

Смотрите обновленный ответ ;)

Wendelius

Хороший ответ-5.

Maciej Los

Спасибо, Мика.