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