C# 使用C语言在窗体中设置Gif动画#
在我的项目中,每当执行一个长过程时,一个小表单就会显示一个小的动画gif文件。我用这个.Show()打开表单,用这个.Close()关闭表单。 下面是我使用的代码C# 使用C语言在窗体中设置Gif动画#,c#,C#,在我的项目中,每当执行一个长过程时,一个小表单就会显示一个小的动画gif文件。我用这个.Show()打开表单,用这个.Close()关闭表单。 下面是我使用的代码 public partial class PlzWaitMessage : Form { public PlzWaitMessage() { InitializeComponent(); } public void ShowSpalshSceen() { this.Show();
public partial class PlzWaitMessage : Form
{
public PlzWaitMessage()
{
InitializeComponent();
}
public void ShowSpalshSceen()
{
this.Show();
Application.DoEvents();
}
public void CloseSpalshScreen()
{
this.Close();
}
}
当窗体打开时,图像文件不会立即开始设置动画。当它真的制作动画时,这个过程通常已经完成或接近完成,这使得动画变得毫无用处。是否有一种方法可以让gif在加载表单后立即进行动画制作?您应该在单独的线程中执行“长过程”。我建议使用
这将使您的代码更加困难。主要原因之一是,您无法从后台线程与UI通信
还要注意链接页面中的警告:
小心
使用的多线程时
任何一种,你都有可能暴露
你自己变得非常严肃和复杂
漏洞。请参阅托管线程
在实施任何
使用多线程的解决方案
如果这太困难,您可以通过“长流程”代码频繁调用Application.DoEvents
无论您选择什么,这都将使用户能够与您的表单交互。例如关闭它。您应该知道这一点。为什么不使用线程?学习新东西总是个好主意 您可以简单地将“长流程”放在后台线程中,并使用事件向表示层报告,例如:
// in your "long process" class
public event Action<double> ReportCompletition;
// this method will start long process in separate background thread
public void Start()
{
Thread thread = new Thread(this.LongProcess);
thread.IsBackground = true;
thread.Start();
}
private void LongProcess()
{
// do something
// report 10% completition by raising event
this.ReportCompletition(0.1);
// do something more
this.ReportCompletition(0.5);
// ... and so on
}
//在“长流程”类中
公共事件行动报告完成;
//此方法将在单独的后台线程中启动长进程
公开作废开始()
{
线程线程=新线程(此.LongProcess);
thread.IsBackground=true;
thread.Start();
}
私有流程()
{
//做点什么
//按引发事件报告10%的完成率
本报告完成情况(0.1);
//多做点什么
本报告完成率(0.5);
//……等等
}
这样,您所要做的就是在表单/UI中实现简单方法,它将使用这些信息
public partial class MainApplicationWindow : Form
{
private LongProcessClass _longProcess;
public MainApplicationWindow
{
this.InitializeComponent();
this._longProcess = new LongProcessClass();
// bind UI updating method to long process class event
this._longProcess.ReportCompletition += this.DisplayCompletitionInfo;
}
private void DisplayCompletitionInfo(double completition)
{
// check if control you want to display info in needs to be invoked
// - request is coming from different thread
if (control.InvokeRequired)
{
Action<double> updateMethod = this.DisplayCompletitionInfo;
control.Invoke(updateMethod, new object[] { completition });
}
// here you put code to do actual UI updating,
// eg. displaying status message
else
{
int progress = (int) completition * 10;
control.Text = "Please wait. Long process progress: "
+ progress.ToString() + "%";
}
}
public分部类main应用程序窗口:表单
{
私有LongProcessClass_longProcess;
公共主应用程序窗口
{
this.InitializeComponent();
这是._longProcess=new LongProcessClass();
//将UI更新方法绑定到长流程类事件
this.\u longProcess.reportcompletion+=this.displayCompletionInfo;
}
私有void显示完成信息(双重完成)
{
//检查是否需要调用要在其中显示信息的控件
//-请求来自不同的线程
if(control.invokererequired)
{
Action updateMethod=this.DisplayCompletionInfo;
Invoke(updateMethod,新对象[]{completion});
}
//在这里,您可以使用代码进行实际的UI更新,
//例如,显示状态信息
其他的
{
整数进度=(整数)完成*10;
control.Text=“请稍候。进程进度过长:”
+progress.ToString()+“%”;
}
}
当然,您可以在长流程中报告任何您喜欢的内容。无论是完成率、准备显示字符串消息还是其他内容。您还可以使用事件报告长流程已完成、中断或任何您想要的长流程数据
有关此主题的更多详细信息,您可能希望查看和上的MSDN教程。在图片框中使用gif,并使用
Form pWait=new Form();pWait.Show()将其打开;
当然是应用程序进程,而不是GIF显示的进程。由于我缺乏经验,我不想使用线程。我正在使用application.DoEvents()函数。在我的代码中,我使用以下代码调用了ShowSpalshSceen()。PlzWaitMessage pMess=new PlzWaitMessage();pMess.ShowSpalshSceen();LoadReport();pMess.closespalshsscreen();我不是在这里做吗?顺便说一句,我表单上的图片框位于一个面板的顶部,这个面板填充了整个小消息表单。@Rabin,如果你想在执行一个漫长的过程时更新UI,你就必须使用线程。它们真的没有那么难-特别是如果你使用BackgroundWorker类来控制它。比如克雷斯夫说,使用线程更好。不使用线程会让你缺乏经验。