c#winFrom实现加载动画

public partial class FrmLoading : Form

    {

        private static Image m_Image = null;

        private EventHandler evtHandler = null;

        private ParameterizedThreadStart workAction = null;

        private object workActionArg = null;

        private Thread workThread = null;

        private TableLayoutPanel tableLayoutPanel1;

        public Label lbMessage;

        private Panel panImage;

        public string Message

        {

            get

            {

                return lbMessage.Text;

            }

            set

            {

                lbMessage.Text = value;

            }

        }

        public bool WorkCompleted = false;

        public Exception WorkException

        { get; private set; }

        public void SetWorkAction(ParameterizedThreadStart workAction, object arg)

        {

            this.workAction = workAction;

            this.workActionArg = arg;

        }

        public FrmLoading(string msg)

        {

            InitializeComponent();

            this.Message = msg;

        }

        protected override void OnPaint(PaintEventArgs e)

        {

            base.OnPaint(e);

            if (m_Image != null)

            {

                //获得当前gif动画下一步要渲染的帧。

                UpdateImage();

                //将获得的当前gif动画需要渲染的帧显示在界面上的某个位置。

                int x = (int)(panImage.ClientRectangle.Width - m_Image.Width) / 2;

                int y = 0;

                //e.Graphics.DrawImage(m_Image, new Rectangle(x, y, m_Image.Width, m_Image.Height));

                panImage.CreateGraphics().DrawImage(m_Image, new Rectangle(x, y, m_Image.Width, m_Image.Height));

            }

            if (this.WorkCompleted)

            {

                this.Close();

            }

        }

        private void FrmProcessing_Load(object sender, EventArgs e)

        {


            if (this.Owner != null)

            {

                this.StartPosition = FormStartPosition.Manual;

                this.Location = new Point(this.Owner.Left, this.Owner.Top);

                //MessageBox.Show(string.Format("X={0},Y={1}", this.Owner.Left, this.Owner.Top));

                this.Width = this.Owner.Width;

                this.Height = this.Owner.Height;

            }

            else

            {

                Rectangle screenRect = Screen.PrimaryScreen.WorkingArea;

                this.Location = new Point((screenRect.Width - this.Width) / 2, (screenRect.Height - this.Height) / 2);

            }

            //为委托关联一个处理方法

            evtHandler = new EventHandler(OnImageAnimate);

            if (m_Image == null)

            {

                Assembly assy = Assembly.GetExecutingAssembly();

                //获取要加载的gif动画文件

                FileStream fs = File.OpenRead(Application.StartupPath + "//image//cc.jpg"); //OpenRead

                int filelength = 0;

                filelength = (int)fs.Length; //获得文件长度

                Byte[] image = new Byte[filelength]; //建立一个字节数组

                fs.Read(image, 0, filelength); //按字节流读取

                m_Image = Image.FromStream(fs);

            }

            //调用开始动画方法

            BeginAnimate();

        }

        //开始动画方法

        private void BeginAnimate()

        {

            if (m_Image != null)

            {

                //当gif动画每隔一定时间后,都会变换一帧,那么就会触发一事件,该方法就是将当前image每变换一帧时,都会调用当前这个委托所关联的方法。

                ImageAnimator.Animate(m_Image, evtHandler);

            }

        }

        //委托所关联的方法

        private void OnImageAnimate(Object sender, EventArgs e)

        {

            //该方法中,只是使得当前这个winform重绘,然后去调用该winform的OnPaint()方法进行重绘)

            this.Invalidate();

        }

        //获得当前gif动画的下一步需要渲染的帧,当下一步任何对当前gif动画的操作都是对该帧进行操作)

        private void UpdateImage()

        {

            ImageAnimator.UpdateFrames(m_Image);

        }

        //关闭显示动画,该方法可以在winform关闭时,或者某个按钮的触发事件中进行调用,以停止渲染当前gif动画。

        private void StopAnimate()

        {

            m_Image = null;

            ImageAnimator.StopAnimate(m_Image, evtHandler);

        }

        private void FrmProcessing_Shown(object sender, EventArgs e)

        {

            if (this.workAction != null)

            {

                workThread = new Thread(ExecWorkAction);

                workThread.IsBackground = true;

                workThread.Start();

            }

        }

        public void ExecWorkAction()

        {

            try

            {

                var workTask = new Task((arg) =>

                {

                    this.workAction(arg);

                },

                this.workActionArg);

                workTask.Start();

                Task.WaitAll(workTask);

            }

            catch (Exception ex)

            {

                this.WorkException = ex;

            }

            finally

            {

                this.WorkCompleted = true;

            }

        }

        private void InitializeComponent()

        {

            this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();

            this.panImage = new System.Windows.Forms.Panel();

            this.lbMessage = new System.Windows.Forms.Label();

            this.tableLayoutPanel1.SuspendLayout();

            this.SuspendLayout();

            //

            // tableLayoutPanel1

            //

            this.tableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)

            | System.Windows.Forms.AnchorStyles.Left)

            | System.Windows.Forms.AnchorStyles.Right)));

            this.tableLayoutPanel1.ColumnCount = 1;

            this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));

            this.tableLayoutPanel1.Controls.Add(this.panImage, 0, 1);

            this.tableLayoutPanel1.Controls.Add(this.lbMessage, 0, 0);

            this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);

            this.tableLayoutPanel1.Name = "tableLayoutPanel1";

            this.tableLayoutPanel1.RowCount = 2;

            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));

            this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));

            this.tableLayoutPanel1.Size = new System.Drawing.Size(1290, 812);

            this.tableLayoutPanel1.TabIndex = 0;

            //

            // panImage

            //

            this.panImage.Dock = System.Windows.Forms.DockStyle.Fill;

            this.panImage.Location = new System.Drawing.Point(3, 409);

            this.panImage.Name = "panImage";

            this.panImage.Size = new System.Drawing.Size(1284, 400);

            this.panImage.TabIndex = 1;

            //

            // lbMessage

            //

            this.lbMessage.AutoSize = true;

            this.lbMessage.Font = new System.Drawing.Font("宋体", 12F);

            this.lbMessage.ForeColor = System.Drawing.Color.Black;

            this.lbMessage.Location = new System.Drawing.Point(590, 350);

            this.lbMessage.Margin = new System.Windows.Forms.Padding(590, 350, 3, 0);

            this.lbMessage.Name = "lbMessage";

            this.lbMessage.Size = new System.Drawing.Size(56, 16);

            this.lbMessage.TabIndex = 0;

            this.lbMessage.Text = "label1";

            this.lbMessage.Visible = false;

            this.ClientSize = new System.Drawing.Size(1290, 812);

            this.Controls.Add(this.tableLayoutPanel1);

            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;

            this.Name = "FrmProcessing";

            this.Opacity = 0.3D;//透明级别

            this.ShowInTaskbar = false;

            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;

            this.Load += new System.EventHandler(this.FrmProcessing_Load);

            this.Shown += new System.EventHandler(this.FrmProcessing_Shown);

            this.tableLayoutPanel1.ResumeLayout(false);

            this.tableLayoutPanel1.PerformLayout();

            this.ResumeLayout(false);

        }



//定义引用方法

public static void ShowLoading(string msg, UserControl owner, ParameterizedThreadStart work, object workArg = null)

        {

            FrmLoading processingForm = new FrmLoading(msg);

            dynamic expObj = new ExpandoObject();

            expObj.Form = processingForm;

            expObj.WorkArg = workArg;

            processingForm.SetWorkAction(work, expObj);

            processingForm.ShowDialog(owner);

            if (processingForm.WorkException != null)

            {

                throw processingForm.WorkException;

            }

        }




调用方式

ShowLoading("", this, (obj) =>

            {

          //执行操作

            }, null);

cc.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352