C#alpha图像重叠

时间:2014-11-04 07:50:28

标签: c# .net custom-controls transparency gdi

我已根据建议的here

创建了一个透明控件
public partial class TransparentControl : UserControl
{
    private readonly Timer refresher;
    private Image _image;

    public TransparentControl()
        {
            SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            BackColor = Color.Transparent;
            refresher = new Timer();
            refresher.Tick += TimerOnTick;
            refresher.Interval = 50;
            refresher.Enabled = true;
            refresher.Start();
        }

        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x20;
                return cp;
            }
        }

        protected override void OnMove(EventArgs e)
        {
            RecreateHandle();
        }


        protected override void OnPaint(PaintEventArgs e)
        {
            e.Graphics.DrawImage(_image, new Rectangle((Width / 2) - (_image.Width / 2), (Height / 2) - (_image.Height / 2), _image.Width, _image.Height));
        }

        protected override void OnPaintBackground(PaintEventArgs e)
        {}

        public void Redraw()
        {
            RecreateHandle();
        }

        private void TimerOnTick(object source, EventArgs e)
        {
            RecreateHandle();
            refresher.Stop();
        }

        public Image Image
        {
            get { _image; }
            set { _image = value; RecreateHandle(); }
        }
}

问题在于,如果我重叠两个TransparentControl对象,那么保持在顶部的对象不会被渲染(或者它可能被渲染但根本不可见)。 是否有东西可以添加到控件来解决这个问题?

因为使用PictureBox作为顶层图像可以正常工作,但是在使用Mono的Linux上它不能渲染alpha像素。这就是我需要使用此TransparentControl的原因。

谢谢大家。

0 个答案:

没有答案