C#顶部动态弹出小窗口

效果

优点

  1. 自上而下延时弹出窗口
  2. 窗口有阴影效果
  3. 可在父窗口中任意简单的改变提示的内容
  4. 背景图片可以改变 但是每一个弹窗对象只能固定一个背景
    缺点
  5. 不能改变弹窗大小,需要更换背景图片才行
  6. 弹窗大小随背景图片的大小而改变 不能固定大小
  7. 弹出窗口的移动路径上不能有其他控件存在 不然显示会出现问题

点击按钮1弹出”加载中“
C#顶部动态弹出小窗口_第1张图片
点击按钮2 弹出”加载成功“
C#顶部动态弹出小窗口_第2张图片

用法

C#顶部动态弹出小窗口_第3张图片

控件代码

命名空间

using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing;
using System.Threading;

代码

    public class TransparentPanel : Panel
    {
        Label Label1 = new Label();
        //新建一个线程用于多线程制作延时效果
        BackgroundWorker _demoBGWorker = new BackgroundWorker();
        //记录用户 规定的弹窗最后出现的位置
        int y;
        int x;
        //弹出窗口的下落开始的位置
        int begin_pos;
        //弹出窗口的隐藏标志当index=100的时候隐藏弹出窗口
        int index = 0;
        public TransparentPanel(int X,int Y,string filePath)
        {
            x = X;
            y = Y;
            begin_pos = Y - 10;
            this.Location = new Point(x, begin_pos);
            this.BackgroundImage = Image.FromFile(filePath);
            this.Size = new Size(this.BackgroundImage.Width, this.BackgroundImage.Height);
            this.Visible = false;

            Label1.Text = "NULL";
            Label1.Location = new Point(55, 36);
            Label1.AutoSize = true;
            Label1.Font = new Font("微软雅黑", 15);
            Label1.BackColor = Color.White;
            this.Controls.Add(Label1);


            _demoBGWorker.DoWork += BGWorker_DoWork;
            _demoBGWorker.WorkerReportsProgress = true;
            _demoBGWorker.ProgressChanged += BGWorker_ProgressChanged;
            _demoBGWorker.WorkerSupportsCancellation = true;
        }

        #region 多线程操作函数
        public void action(string Tips)
        {
            Label1.Text = Tips;
            Label1.Location = new Point(this.Width/2 - Label1.Width/2, this.Height/2-Label1.Height/2-3);
            if (this.Visible != true)
            {
                this.Visible = true;
                _demoBGWorker.RunWorkerAsync();
            }
        
        }
        private void BGWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker bgWorker = sender as BackgroundWorker;
            for (int i = begin_pos; true; i++)
            {
                bgWorker.ReportProgress(i);
                Thread.Sleep(1);
                if (bgWorker.CancellationPending == true)
                {
                    e.Cancel = true;
                    break;
                }
            }
        }
        private void BGWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            int kk = e.ProgressPercentage;
            if (kk < y)
            {
                this.Location = new Point(x,kk);
            }
            if (kk >= y)
            {
                index++;
                if (index >= 100)
                {
                    index = 0;
                    this.Visible = false;
                    _demoBGWorker.CancelAsync();
                    this.Location = new Point(x, 0);
                }
            }
            

        }
        #endregion

        #region 透明背景配置
        protected override void OnPaintBackground(PaintEventArgs e) { }
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT
                return cp;
            }
        }
        protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
            if (BackgroundImage != null) e.Graphics.DrawImage(this.BackgroundImage, new Point(0, 0));
        }
        #endregion

    }

你可能感兴趣的:(C#,自定义控件,c#,ui)