Реза Агаи уже рассказал вам, что на самом деле мешает прозрачности Panel работать вообще:
WS_EX_TRANSPARENT
было установлено на 0x00
вместо 0x20
.
Некоторые предложения по улучшению внешнего вида полупрозрачной панели.
- Протестируйте панель, установив эти стили :
Это предотвратит любые артефакты на панели, когда вы перемещаете ее как во время разработки, так и во время выполнения.
this.SetStyle(ControlStyles.AllPaintingInWmPaint |
ControlStyles.UserPaint |
ControlStyles.Opaque, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, false);
this.DoubleBuffered = false;
this.UpdateStyles();
- При установке значения непрозрачности :
Используйте Refresh()
, если это Desing-Time, это немедленно обновит новый Opacity
визуал. В противном случае вам нужно будет нажать на форму, чтобы увидеть изменения. Во время выполнения достаточно Invalidate()
(обычно).
set {
if (value < 0 || value > 255) throw new ArgumentException("value must be between 0 and 255");
this.opacity = value;
if (this.DesignMode) this.FindForm().Refresh();
this.Invalidate();
}
Модифицированный тестовый класс:
public class ExtendedPanel : Panel
{
private const int WS_EX_TRANSPARENT = 0x20;
public ExtendedPanel()
{
this.SetStyle(ControlStyles.AllPaintingInWmPaint |
ControlStyles.UserPaint |
ControlStyles.Opaque, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, false);
this.DoubleBuffered = false;
this.UpdateStyles();
}
private int opacity = 1;
[DefaultValue(1)]
public int Opacity
{
get => this.opacity;
set {
if (value < 0 || value > 255) throw new ArgumentException("value must be between 0 and 255");
this.opacity = value;
if (this.DesignMode) this.FindForm().Refresh();
this.Invalidate();
}
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle = cp.ExStyle | WS_EX_TRANSPARENT;
return cp;
}
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
using (SolidBrush bgbrush = new SolidBrush(Color.FromArgb(this.opacity, this.BackColor)))
{
e.Graphics.FillRectangle(bgbrush, this.ClientRectangle);
}
}
}