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

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 @ 2014-04-24 17:28  上海-天浩  阅读(1045)  评论(0编辑  收藏  举报

Living in ShangHai

Copyright © 2008 天浩阁 Corporation, All Rights Reserved