winforms 用最小化方法绘制透明无黑面板

tez616oj  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(110)

我正在用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);
}

}

bn31dyow

bn31dyow1#

Reza Aghaei已经告诉过你,是什么实际上阻碍了Maven组透明度的发挥:

**WS_EX_TRANSPARENT**被设置为0x00而不是0x20

提出了改善半透明面板外观的几点建议。

*测试面板设置这些样式

这将防止在设计时和运行时移动面板时面板上出现任何伪影。

SetStyle(ControlStyles.AllPaintingInWmPaint |
         ControlStyles.UserPaint |
         ControlStyles.Opaque, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, false);

*设置不透明度值时

如果是设计阶段,请使用**Refresh(),这会立即更新新的Opacity视觉效果。否则,您必须按一下表单才能看到变更。在执行阶段,Invalidate()**就足够了(通常)。

set {
    if (value < 0 || value > 255) throw new ArgumentException("value must be between 0 and 255");
    opacity = value;
    if (DesignMode) FindForm().Refresh();
    Invalidate();
}

修改的测试类:

public class ExtendedPanel : Panel
{
    private const int WS_EX_TRANSPARENT = 0x20;
    public ExtendedPanel() {
        SetStyle(ControlStyles.AllPaintingInWmPaint |
                 ControlStyles.UserPaint |
                 ControlStyles.Opaque, true);
        SetStyle(ControlStyles.OptimizedDoubleBuffer, false);
        DoubleBuffered = false;
    }

    private int opacity = 1;

    [DefaultValue(1)]
    public int Opacity {
        get => opacity;
        set {
            if (value < 0 || value > 255) throw new ArgumentException("value must be between 0 and 255");
            opacity = value;
            if (DesignMode) FindForm().Refresh();
            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 (var brush = new SolidBrush(Color.FromArgb(opacity, BackColor))) {
            e.Graphics.FillRectangle(brush, ClientRectangle);
        }
    }
}

相关问题