| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 | using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Reflection;using System.Threading;using System.Threading.Tasks;namespace WCS_Client{    public partial class FrmProcessing : Form    {        private static Image m_Image = null;        private EventHandler evtHandler = null;        private ParameterizedThreadStart workAction = null;        private object workActionArg = null;        private Thread workThread = null;        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 FrmProcessing(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动画文件               // m_Image = Image.FromStream(assy.GetManifestResourceStream(assy.GetName().Name + ".Resources.loding.gif"));                m_Image = global::WCS_Client.Properties.Resources.loading;            }            //调用开始动画方法            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();            }        }        private 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.Close();                this.WorkCompleted = true;            }        }    }}
 |