2

我在 Windows 窗体用户控件中创建了一个简单的棒人(由一个单选按钮和三个标签和一个进度条组成)。

我将新用户控件的背景颜色设置为透明,这样当我将它拖到表单上时,它会与表单上的其他颜色和绘图混合。我没有得到我想要达到的目标。

这是图片:

在此处输入图像描述

4

3 回答 3

11

UserControl 已经支持这个,它的 ControlStyles.SupportsTransparentBackColor 样式标志已经打开。您所要做的就是将 BackColor 属性设置为 Color.Transparent。

接下来你必须记住,这种透明度是模拟的,它是通过要求控件的父级绘制自身以产生背景来完成的。因此,重要的是您正确设置了 Parent 。如果父级不是容器控件,这有点棘手。就像一个图片框。设计器将使表单成为父级,因此您将看到表单的背景,而不是图片框。您需要在代码中修复它,编辑表单构造函数并使其看起来与此类似:

var pos = this.PointToScreen(userControl11.Location);
userControl11.Parent = pictureBox1;
userControl11.Location = pictureBox1.PointToClient(pos);
于 2013-01-13T17:55:52.833 回答
4

在构造函数中设置控件样式以支持透明背景色

SetStyle(ControlStyles.SupportsTransparentBackColor, true);

然后将背景设置为透明色

this.BackColor = Color.Transparent;

来自MSDN

此处描述了一种更复杂的方法(并且可能是有效的方法)- 覆盖CreateParamsOnPaint

于 2013-01-13T17:18:27.463 回答
2

为什么所有这些事情?UserControl 类具有属性 Region。将此设置为您喜欢的任何形状,无需其他调整。

public partial class TranspBackground : UserControl
{
    public TranspBackground()
    {
        InitializeComponent();
    }

    GraphicsPath GrPath
    {
        get
        {
            GraphicsPath grPath = new GraphicsPath();
            grPath.AddEllipse(this.ClientRectangle);
            return grPath;
        }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        // set the region property to the desired path like this
        this.Region = new System.Drawing.Region(GrPath);

        // other drawing goes here
        e.Graphics.FillEllipse(new SolidBrush(ForeColor), ClientRectangle);
    }

}

结果如下图所示:

在此处输入图像描述 没有低级代码,没有调整,简单干净。然而,有一个问题,但在大多数情况下,它可能未被检测到,边缘不平滑,抗锯齿也无济于事。但解决方法相当简单。实际上比所有那些复杂的后台处理要容易得多..

于 2015-12-21T20:48:09.780 回答