C# 使用C语言在窗体中设置Gif动画#

C# 使用C语言在窗体中设置Gif动画#,c#,C#,在我的项目中,每当执行一个长过程时,一个小表单就会显示一个小的动画gif文件。我用这个.Show()打开表单,用这个.Close()关闭表单。 下面是我使用的代码 public partial class PlzWaitMessage : Form { public PlzWaitMessage() { InitializeComponent(); } public void ShowSpalshSceen() { this.Show();

在我的项目中,每当执行一个长过程时,一个小表单就会显示一个小的动画gif文件。我用这个.Show()打开表单,用这个.Close()关闭表单。 下面是我使用的代码

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类来控制它。比如克雷斯夫说,使用线程更好。不使用线程会让你缺乏经验。