Мне было интересно, как изменить или изменить прозрачность панели в С#, а не всю форму, но панель только. Я видел много уроков С# по Opacity, но для формы. im ищет, как это возможно с Panel. Спасибо!
Как установить прозрачность или прозрачность панели в WinForms?
Ответ 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)