自定义控件透明

Posted tony-brook

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义控件透明相关的知识,希望对你有一定的参考价值。

  最近要用到一个日期控件, 自带控件不符合要求,网上找了也没想要的。……于是乎有了该文章……

自拍一张:

技术分享图片

 

如上图,新建usercontrol,添加textbox、picturebox、monthcalendar。(图 上的小正方形就是picturebox可以根据图标自己定义)

因为想要文本框的大小做特定修改, 就在textbox外面套了一层panel 给了个border 充当textbox的边框。

我的目的就是把textbox 和 monthcalendar没有覆盖的部分透明,代码如下:

public partial class IrisCalendar : UserControl
    {
        public IrisCalendar()
        {
            InitializeComponent();
            //背景透明
            Image = Properties.Resources.calendar; //一张跟usercontrol等大小的透明图片
            SetStyle(ControlStyles.SupportsTransparentBackColor
          | ControlStyles.UserPaint
          | ControlStyles.AllPaintingInWmPaint
          | ControlStyles.Opaque, true);
            BackColor = Color.Transparent;
        }

        #region 背景透明
        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, 80, 0);
        }
        #endregion

        //点击图标
        private void picCalendar_Click(object sender, EventArgs e)
        {
            CalendarVisible();
        }

        //隐藏or显示控件
        private void CalendarVisible()
        {
            if (this.dateCalendar.Visible)
            {
                this.dateCalendar.Visible = false;
                this.Width = 140;
                this.Height = 30;
                this.image = Properties.Resources.calendar_little;
            }
            else
            {
                this.dateCalendar.Visible = true;
                this.Width = 220;
                this.Height = 210;
            }
        }
    }

  透明的目的实现了, 但是出现了其他的问题。 比如:在monthcalendar控件隐藏的时候, 会导致这一块区域还是自定义控件的区域。

  如果你的目的只是透明, 那就够了。如果不是的话, 未完待续(也希望有人能提供更好的,感激不尽)……

以上是关于自定义控件透明的主要内容,如果未能解决你的问题,请参考以下文章

无法使自定义 DialogFragment 在 Fragment 上透明

自定义控件透明

怎样自定义一个背景可以透明的richTextBox控件

如何保持自定义绘制的复选框控件的透明度

qt 窗体透明,控件不透明

如何用C#写一个透明控件?(WinForm程序)