Как я могу установить непрозрачность или прозрачность панели в WinForms? - PullRequest
43 голосов
/ 16 декабря 2010

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

Ответы [ 9 ]

40 голосов
/ 20 марта 2013

Для тех, кто все еще ищет полностью прозрачную панель, я нашел хорошее решение в этом блоге Уильяма Смаша , который в свою очередь взял его от Тобиаса Херткорна в своем блоге 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
34 голосов
/ 16 декабря 2010

Да, прозрачность может работать только в окнах верхнего уровня. Он использует аппаратную функцию видеоадаптера, которая не поддерживает дочерние окна, например Panel. Единственный производный класс управления верхнего уровня в 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 (он же Aero) больше нельзя отключить. Что делает прозрачность / прозрачность дочерних окон легко реализуемой. Полагаться на это, конечно же, будет музыка будущего. Windows 7 будет следующей XP:)

12 голосов
/ 31 января 2014

Основываясь на информации, найденной на 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 голосов
/ 19 февраля 2016

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

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

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

3 голосов
/ 16 декабря 2010

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

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

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

3 голосов
/ 16 декабря 2010

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

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

0 голосов
/ 05 января 2018

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

0 голосов
/ 06 января 2017

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

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

0 голосов
/ 10 июня 2015

Я просто хотел добавить решение Уильяма Смаша, так как не смог добраться до его блога, чтобы не было ответов на мои простые вопросы, которые могли быть там.

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

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

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

Imports System.Windows.Forms 

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

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

Imports System.Drawing.Printing.PrintEventArgs
...