[转]C#自定义控件背景色透明的方法

在一项目要设置一自定义(画箭头)控件为透明色,以便控件叠加时可以完整显示线条,百度到以下文章,测试,效果达到要求.
 
 

 
转自:http://www.cnblogs.com/crid/archive/2009/05/24/1488495.html

I struggled for ages with the problem of having controls show through a control that was painted on top of them.  It seems that ControlStyles.SupportsTransparentBackColor just allowed the control to pick up the container's background colour/image and wouldn't prevent the control from hiding any controls that were underneath it. I eventually found an answer so I thought I would post it here.  This code example of a Pointer class, will take an alpha-blended png in the constructor and allow all the controls behind it to show through the transparent or semi-transparent pixels in the png, even when the pointer's location is changed ...

public class Pointer : Control
{
    public Pointer(Image image)
        : base()
    {
        Image = image;
        SetStyle(ControlStyles.SupportsTransparentBackColor
          | ControlStyles.UserPaint
          | ControlStyles.AllPaintingInWmPaint
          | ControlStyles.Opaque, true);
        BackColor = Color.Transparent;
    }

    protected override void OnLocationChanged(EventArgs e)
    {
        // pick up the container's surface again. 
        Visible = false;
        Visible = true;
    }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT 
            return cp;
        }
    }

    private Image image;
    public Image Image
    {
        get
        {
            return image;
        }
        set
        {
            image = value;
            Size = image.Size;
        }
    }

    protected override void OnPaint(PaintEventArgs pe)
    {
        base.OnPaint(pe);
        pe.Graphics.DrawImage(image, 0, 0);
    }

}

posted on 2012-10-25 21:42  SuperCai  阅读(2195)  评论(0编辑  收藏  举报

导航