使控件透明

本文关键字:透明 控件 | 更新日期: 2023-09-27 18:25:14

我目前正在使用Winforms.NET 3.5(工作环境)开发一个简单的图像编辑工具。

我有一个要求,当用户单击选择工具按钮时,会出现一个正方形(C#中的矩形),他们可以在100x100400x400之间缩放。我已经解决了这个问题——这个问题与使矩形的背景透明有关。

我有点不清楚.NET 3.5是否支持透明度,我尝试了以下方法:

SetStyle(ControlStyles.SupportsTransparentBackColor, true);
pnlSelectArea.BackColor = Color.Transparent;
pnlSelectArea.ForeColor = Color.Transparent;
selectArea1.BackColor = Color.Transparent;
selectArea1.ForeColor = Color.Transparent;

但这没有任何效果——任何建议都将不胜感激。

使控件透明

这是我的特殊控件,包含不透明度属性,它100%有效:

using System;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Design;
public class TranspCtrl : Control
{
    public bool drag = false;
    public bool enab = false;
    private int m_opacity = 100;
    private int alpha;
    public TranspCtrl()
    {
        SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        SetStyle(ControlStyles.Opaque, true);
        this.BackColor = Color.Transparent;
    }
    public int Opacity
    {
        get
        {
            if (m_opacity > 100)
            {
                m_opacity = 100;
            }
            else if (m_opacity < 1)
            {
                m_opacity = 1;
            }
            return this.m_opacity;
        }
        set
        {
            this.m_opacity = value;
            if (this.Parent != null)
            {
                Parent.Invalidate(this.Bounds, true);
            }
        }
    }
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle = cp.ExStyle | 0x20;
            return cp;
        }
    }
    protected override void OnPaint(PaintEventArgs e)
    {
        Graphics g = e.Graphics;
        Rectangle bounds = new Rectangle(0, 0, this.Width - 1, this.Height - 1);
        Color frmColor = this.Parent.BackColor;
        Brush bckColor = default(Brush);
        alpha = (m_opacity * 255) / 100;
        if (drag)
        {
            Color dragBckColor = default(Color);
            if (BackColor != Color.Transparent)
            {
                int Rb = BackColor.R * alpha / 255 + frmColor.R * (255 - alpha) / 255;
                int Gb = BackColor.G * alpha / 255 + frmColor.G * (255 - alpha) / 255;
                int Bb = BackColor.B * alpha / 255 + frmColor.B * (255 - alpha) / 255;
                dragBckColor = Color.FromArgb(Rb, Gb, Bb);
            }
            else
            {
                dragBckColor = frmColor;
            }
            alpha = 255;
            bckColor = new SolidBrush(Color.FromArgb(alpha, dragBckColor));
        }
        else
        {
            bckColor = new SolidBrush(Color.FromArgb(alpha, this.BackColor));
        }
        if (this.BackColor != Color.Transparent | drag)
        {
            g.FillRectangle(bckColor, bounds);
        }
        bckColor.Dispose();
        g.Dispose();
        base.OnPaint(e);
    }
    protected override void OnBackColorChanged(EventArgs e)
    {
        if (this.Parent != null)
        {
            Parent.Invalidate(this.Bounds, true);
        }
        base.OnBackColorChanged(e);
    }
    protected override void OnParentBackColorChanged(EventArgs e)
    {
        this.Invalidate();
        base.OnParentBackColorChanged(e);
    }
}

您需要使用Opacity属性并将其设置为零以使表单不可见。

如果你想让一个控件透明,就像你在例子中尝试的那样,请参阅本文

如何:给你的控制一个透明的背景

它说您编写的代码必须在控件的构造函数中。因此,我想,您将需要创建一个从pnlSelectArea的类型派生的自定义控件,很可能是一个按钮。在该自定义控件的构造函数中,您可以编写代码来设置其样式和颜色。

以下是对我有效的方法,因为其他解决方案不起作用。

这是透明的UserControl添加到ListView/TreeView控件集合

我知道上面写着ButtonRenderer,但它应该适用于任何控件。

在用户控制中:

protected override void OnPaint(PaintEventArgs e)
{
    ButtonRenderer.DrawParentBackground(e.Graphics, this.ClientRectangle, this);
}

在父控件中:

protected override void WndProc(ref Message m) 
{
    if(m.Msg == 0xF)
        foreach(Control c in this.Controls) { c.Invalidate(); c.Update(); }
    base.WndProc(ref m);
}

太棒了!!我终于画出了透明的形状。我添加了一个虚拟方法

Draw(g);

之前

bckColor.Dispose();
g.Dispose();
base.OnPaint(e);

并在最后声明虚拟方法

protected virtual void Draw(Graphics g){ }

现在我可以继续创建我自己的透明形状,图形等。。。

有一个简单的解决方法。可以创建具有透明背景(PNG)的图像,并将其添加到图标的"图像"属性中。这很好,因为信息在样式上没有太大的灵活性。有时这可能不适合所有人。请记住,这只是一种变通方法

PS:将文本添加到图像上的任何位置,并为text属性保留空白。