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

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

9 ответов


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

некоторые из "чистых" элементов управления 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:)


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

C# код:

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

на основе информации, найденной в 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, чтобы фокус пользователей был смещен в соответствующую область приложения.


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

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


попробуйте это:

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

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


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

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(); 

/ /


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

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

Если вы еще не сделали этого, вам нужно будет добавить ссылку на систему.Окна.Формы в свойствах проекта.

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

Imports System.Windows.Forms 

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

для OnPaintBackground вам нужно добавить ссылку для системы.Рисование тогда

Imports System.Drawing.Printing.PrintEventArgs

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


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

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