我正在用C#在picturebox中的位图上绘制一个面板。我使用了下面的代码,当我不最小化窗体时,这是很好的。当我最小化窗体并再次最大化到第一个大小时,所有由该类绘制的面板,显示黑色背景。我发现当我将ControlStyles.Opaque更改为“SupportsTransparentBackColor”等其他内容时该问题将被解决,但是面板将不再是透明的。
public class ExtendedPanel : Panel
{
private const int WS_EX_TRANSPARENT = 0x00;
public ExtendedPanel()
{
SetStyle(ControlStyles.Opaque, true);
}
private int opacity = 1;
[DefaultValue(1)]
public int Opacity
{
get
{
return this.opacity;
}
set
{
if (value < 0 || value > 100)
throw new ArgumentException("value must be between 0 and 100");
this.opacity = value;
}
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle = cp.ExStyle | WS_EX_TRANSPARENT;
return cp;
}
}
protected override void OnPaint(PaintEventArgs e)
{
using (var brush = new SolidBrush(Color.FromArgb(this.opacity * 1 / 100, this.BackColor)))
{
e.Graphics.FillRectangle(brush, this.ClientRectangle);
}
base.OnPaint(e);
}
}
1条答案
按热度按时间bn31dyow1#
Reza Aghaei已经告诉过你,是什么实际上阻碍了Maven组透明度的发挥:
**
WS_EX_TRANSPARENT
**被设置为0x00
而不是0x20
。提出了改善半透明面板外观的几点建议。
*测试面板设置这些样式:
这将防止在设计时和运行时移动面板时面板上出现任何伪影。
*设置不透明度值时:
如果是设计阶段,请使用**
Refresh()
,这会立即更新新的Opacity
视觉效果。否则,您必须按一下表单才能看到变更。在执行阶段,Invalidate()
**就足够了(通常)。修改的测试类: