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; } } } }