如何显示(透明)BackColor不覆盖控件下方的控件?

时间:2014-03-09 12:51:03

标签: c# winforms controls transparency backcolor

我有自定义Control

public class Temp : Control
{
    public Temp(Color col, int x, int y)
    {
        Size = new Size(x + 10, y + 10);
        this.x = x;
        this.y = y;

        SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        BackColor = col;
    }

    int x, y;

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        using (var p = new Pen(Color.Black, 3))
        {
            e.Graphics.DrawLine(p, new Point(10, 10), new Point(x, y));
        }
    }

}

从我Load的{​​{1}}事件中,我将其中两个控件添加到Form的{​​{1}}中,我添加为我的表单的唯一控件:

Control

这是输出:

enter image description here

正如你可以看到第一个控件覆盖第二个控件,而我只想显示控制背景颜色透明的两行。

请注意,使用透明BackColor不起作用:

Panel

这是输出:

enter image description here

我该如何解决这个问题?也就是说,只显示(并且完全)我的两条线?

2 个答案:

答案 0 :(得分:1)

而不是从Control继承,在自定义类中创建两个点。 示例代码如下所示

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace SOWinForm
{
    public partial class Form1 : Form
    {
        List<Line> lines;
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            lines = new List<Line>();
            lines.Add(new Line(){ StartPoint = new Point(10,10), EndPoint = new Point(10,100)});
            lines.Add(new Line() { StartPoint = new Point(10, 10), EndPoint = new Point(50, 50) });
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            foreach (var line in lines)
            {
                using (var p = new Pen(Color.Black, 3))
                {
                    e.Graphics.DrawLine(p, line.StartPoint, line.EndPoint);
                }
            }
        }
    }

    public class Line
    {
        public Point StartPoint {get;set;}
        public Point EndPoint { get; set; }

        //Add Custom Properties
    }
}

答案 1 :(得分:1)

设置透明背景色并不意味着背景色是透明的而是 父级的颜色。第一个控件的父级是面板(灰色),因此控件的颜色也是灰色。将第一个控件的父级设置为第二个控件的父级。

瓦尔特