Подтвердить что ты не робот

Как установить прозрачность или прозрачность панели в WinForms?

Мне было интересно, как изменить или изменить прозрачность панели в С#, а не всю форму, но панель только. Я видел много уроков С# по Opacity, но для формы. im ищет, как это возможно с Panel. Спасибо!

4b9b3361

Ответ 1

Да, непрозрачность может работать только на окнах верхнего уровня. Он использует аппаратную функцию видеоадаптера, которая не поддерживает дочерние окна, например Panel. Единственным производным классом класса верхнего уровня в Winforms является форма.

Некоторые из "чистых" элементов управления Winform, те, которые делают свою собственную картину вместо того, чтобы позволить встроенному контроллеру Windows выполнять эту работу, однако поддерживают прозрачный BackColor. Панель - одна из них. Он использует трюк, он просит родителя рисовать себя для создания фоновых пикселей. Один побочный эффект этого трюка заключается в том, что перекрывающиеся элементы управления не работают, вы видите только родительские пиксели, а не перекрывающиеся элементы управления.

Этот образец формы показывает его на работе:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        this.BackColor = Color.White;
        panel1.BackColor = Color.FromArgb(25, Color.Black);
    }
    protected override void OnPaint(PaintEventArgs e) {
        e.Graphics.DrawLine(Pens.Yellow, 0, 0, 100, 100);
    }
}

Если это не достаточно хорошо, вам нужно рассмотреть складывающиеся формы друг над другом. Как это.

Примечательно, что это ограничение снимается в Windows 8. Он больше не использует функцию наложения видеоадаптера, и DWM (aka Aero) больше не может быть отключен. Это упрощает реализацию прозрачности и прозрачности на дочерних окнах. Опираясь на это, конечно, будущая музыка на какое-то время. Windows 7 будет следующей XP:)

Ответ 2

Для тех, кто все еще ищет полностью прозрачную панель, я нашел приятное решение в этом блоге William Smash, который, в свою очередь, взял его из Тобиас Херткорн в своем блоге T #. Я думал, что его стоит опубликовать здесь как ответ.

Код С#:

public class TransparentPanel : Panel
{
    protected override CreateParams CreateParams 
    {            
        get {
            CreateParams cp =  base.CreateParams;
            cp.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT
            return cp;
            }
    }
    protected override void OnPaintBackground(PaintEventArgs e) 
    {
        //base.OnPaintBackground(e);
    }
}

Код VB.Net:

Public Class TransparentPanel
Inherits Panel
    Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams
        Get
            Dim cp As CreateParams = MyBase.CreateParams
            cp.ExStyle = cp.ExStyle Or &H20 ''#WS_EX_TRANSPARENT
            Return cp
        End Get
    End Property
    Protected Overrides Sub OnPaintBackground(ByVal e As System.Windows.Forms.PaintEventArgs)
    ''#MyBase.OnPaintBackground(e)
    End Sub
End Class

Ответ 3

Основываясь на информации, найденной в http://www.windows-tech.info/3/53ee08e46d9cb138.php, я смог добиться полупрозрачного управления панелью с помощью следующего кода.

public class TransparentPanel : Panel
{
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT
            return cp;
        }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        e.Graphics.FillRectangle(new SolidBrush(this.BackColor), this.ClientRectangle);
    }
}

Предостережение заключается в том, что любые элементы управления, которые добавляются в панель, имеют непрозрачный фон. Тем не менее, полупрозрачная панель была полезной для меня, чтобы заблокировать части моего приложения WinForms, чтобы пользователи фокусировались, были смещены в соответствующую область приложения.

Ответ 4

Не забудьте принести свою панель на передний план, динамически создавая ее в конструкторе формы. Пример прозрачного наложения панели управления вкладками.

panel1 = new TransparentPanel();
panel1.BackColor = System.Drawing.Color.Transparent;
panel1.Location = new System.Drawing.Point(0, 0);
panel1.Name = "panel1";
panel1.Size = new System.Drawing.Size(717, 92);
panel1.TabIndex = 0;
tab2.Controls.Add(panel1);
panel1.BringToFront(); 

//< == в противном случае другие элементы управления красятся поверх прозрачной панели

Ответ 5

Насколько я знаю, панель может иметь только прозрачный цвет, вы не можете контролировать непрозрачность панели. Таким образом, вы можете иметь некоторые части панели полностью прозрачные, но не 50% сказать что-то.

Чтобы использовать прозрачность, вы должны определить свойство прозрачного цвета.

Ответ 6

Попробуйте следующее:

panel1.BackColor = Color.FromArgb(100, 88, 44, 55);

измените альфа (A), чтобы получить желаемую непрозрачность.

Ответ 7

Я просто хотел добавить к решению William Smash, поскольку я не мог добраться до его блога, поэтому ответы, которые, возможно, были там, на мои простые вопросы, не могли быть найдены.

Понадобился время, чтобы понять, но, может быть, у меня был момент...

Если вам уже не приходилось это делать, вам нужно добавить ссылку на System.Windows.Forms в свойствах проекта.

Также вам нужно добавить

Imports System.Windows.Forms 

в файл, в который вы добавляете класс переопределения.

Для OnPaintBackground вам нужно добавить ссылку для System.Drawing, затем

Imports System.Drawing.Printing.PrintEventArgs

Ответ 8

некоторые комментарии говорят, что он работает, а некоторые говорят, что это не работает. Он работает только для вашего фона form не для каких-либо других controls

Ответ 9

Панель с непрозрачностью:

public class GlassyPanel : Panel
{
    const int WS_EX_TRANSPARENT = 0x20;  

    int opacity = 50;

    public int Opacity
    {
        get
        {
            return opacity;
        }
        set
        {
            if (value < 0 || value > 100) throw new ArgumentException("Value must be between 0 and 100");
            opacity = value;
        }
    }

    protected override CreateParams CreateParams
    {
        get
        {
            var cp = base.CreateParams;
            cp.ExStyle = cp.ExStyle | WS_EX_TRANSPARENT;

            return cp;
        }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        using (var b = new SolidBrush(Color.FromArgb(opacity * 255 / 100, BackColor)))
        {
            e.Graphics.FillRectangle(b, ClientRectangle);
        }

        base.OnPaint(e);
    }
}

Ответ 10

Это работает для меня. В приведенном ниже примере диапазон Alpha может быть значением от 0 до 255. Раньше я ошибался, думая, что это должно быть значение процента.

Dim x as integer = 230 Panel1.BackColor = Color.FromArgb(x, Color.Blue)