如何在窗口表单应用程序中构建闪屏?

我需要在应用程序启动时显示启动画面几秒钟。有人知道如何实现这一点吗?

非常感谢你的帮助。

159113 次浏览

这里有一些指导步骤..。

  1. 创建一个无边框的表单(这将是您的启动画面)
  2. 在应用程序启动时,启动一个计时器(间隔几秒)
  3. 显示您的溅射形式
  4. 在计时器。勾选事件,停止计时器和关闭 Splash 表单-然后显示您的主要应用程序表单

试试这个,如果你卡住了,再回来问一些与你的问题相关的更具体的问题

首先,将启动画面创建为一个无边框的、不可移动的形式,并在其上显示您的图像,设置为最初显示在屏幕中心,按照您希望的方式着色。所有这些都可以在设计器内部进行设置; 具体来说,您希望:

  • 将窗体的 ControlBox、 MaximizeBox、 MiniizeBox 和 ShowIcon 属性设置为“ False”
  • 将 StartPosition 属性设置为“ CenterScreen”
  • 将 FormBorderStyle 属性设置为“ None”
  • 将窗体的 MinimumSize 和 MaximumSize 设置为与其初始 Size 相同。

然后,你需要决定在哪里展示它,在哪里驳回它。这两个任务需要发生在程序主启动逻辑的对立面。这可能出现在你的应用程序的 main ()例程中,或者可能出现在你的主应用程序表单的 Load 处理程序中; 无论你在哪里创建大型昂贵的对象,从硬盘读取设置,通常在主应用程序屏幕显示之前需要很长时间在后台做一些事情。

然后,您所要做的就是创建表单的一个实例 Show () it,并在启动初始化时保留对它的引用。一旦加载了主窗体,Close ()它。

如果你的启动画面上有一个动画图像,窗口也需要“双缓冲”,你需要绝对确保所有的初始化逻辑发生在 GUI 线程之外(这意味着你不能在主表单的 Load 处理程序中使用主加载逻辑; 你必须创建一个 BackoundWorker 或其他线程例程。

首先,您应该创建一个有或没有边框的窗体(无边框是这些事情的首选)

public class SplashForm : Form
{
Form _Parent;
BackgroundWorker worker;
public SplashForm(Form parent)
{
InitializeComponent();
BackgroundWorker worker = new BackgroundWorker();
this.worker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.worker _DoWork);
backgroundWorker1.RunWorkerAsync();
_Parent = parent;
}
private void worker _DoWork(object sender, DoWorkEventArgs e)
{
Thread.sleep(500);
this.hide();
_Parent.show();
}
}

在 Main 你应该用这个

   static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new SplashForm());
}
}

制造轰动效应

private void timer1_Tick(object sender, EventArgs e)
{
counter++;
progressBar1.Value = counter *5;
// label2.Text = (5*counter).ToString();
if (counter ==20)
{
timer1.Stop();
this.Close();
}
}
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.SystemColors.GradientInactiveCaption;
this.ClientSize = new System.Drawing.Size(397, 283);
this.ControlBox = false;
this.Controls.Add(this.label2);
this.Controls.Add(this.progressBar1);
this.Controls.Add(this.label1);
this.ForeColor = System.Drawing.SystemColors.ControlLightLight;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Name = "Splash";
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.ResumeLayout(false);
this.PerformLayout();

然后在你的申请表里

sp = new Splash();
sp.ShowDialog();

这里的其他答案很好地涵盖了这一点,但值得一提的是,Visual Studio 中有内置的启动画面功能: 如果你打开窗口表单应用的项目属性并查看应用程序选项卡,在底部有一个“启动画面:”选项。你只需要选择你的应用程序中的哪个表单作为启动画面显示,它会在应用程序启动时显示它,并在主表单显示后隐藏它。

您仍然需要像上面描述的那样设置表单(使用正确的边框、位置、大小等)

创建启动画面的简单易行的解决方案

  1. 打开新表单使用名称“ SPLASH”
  2. 改变你想要的背景图像
  3. 选择进度条
  4. 选择计时器

现在设定计时器时间:

private void timer1_Tick(object sender, EventArgs e)
{
progressBar1.Increment(1);
if (progressBar1.Value == 100) timer1.Stop();
}

添加新表单使用名称“ FORM-1”,并在 FORM 1中使用以下命令。

注意: 启动表单在打开表单1之前可以工作

  1. 添加这个库

    using System.Threading;
    
  2. create function

    public void splash()
    {
    Application.Run(new splash());
    }
    
  3. use following command in initialization like below.

    public partial class login : Form
    {
    public login()
    {
    Thread t = new Thread(new ThreadStart(splash));
    t.Start();
    Thread.Sleep(15625);
    
    
    InitializeComponent();
    
    
    enter code here
    
    
    t.Abort();
    }
    }
    

http://solutions.musanitech.com/c-create-splash-screen/

试试这个代码

public partial class ssplashscreen : Form
{
public ssplashscreen()
{
InitializeComponent();
}


private void timer1_Tick(object sender, EventArgs e)
{
progressBar1.Increment(1);
if (progressBar1.Value == 100)
{
timer1.Stop();
this.Hide();
Form frm = new login();
frm.Show();
}
}
}

试试这个:

namespace SplashScreen
{
public partial class frmSplashScreen : Form
{
public frmSplashScreen()
{
InitializeComponent();
}


public int LeftTime { get; set; }


private void frmSplashScreen_Load(object sender, EventArgs e)
{
LeftTime = 20;
timer1.Start();
}


private void timer1_Tick(object sender, EventArgs e)
{
if (LeftTime > 0)
{
LeftTime--;
}
else
{
timer1.Stop();
new frmHomeScreen().Show();
this.Hide();
}
}
}
}

我想要一个启动画面,将显示,直到主程序的形式准备显示,所以计时器等对我来说没有用处。我也想尽可能简单。 我的申请开头是(缩写) :

static void Main()
{
Splash frmSplash = new Splash();
frmSplash.Show();
Application.Run(new ReportExplorer(frmSplash));
}

然后,ReportExplorer 具有以下内容:

public ReportExplorer(Splash frmSplash)
{
this.frmSplash = frmSplash;
InitializeComponent();
}

最后,在所有初始化工作完成后:

if (frmSplash != null)
{
frmSplash.Close();
frmSplash = null;
}

也许我遗漏了什么,但这似乎比摆弄线程和计时器要容易得多。

也许现在回答有点晚了,但我愿意分享我的方式。 我在 winform 应用程序的主程序中找到了一种简单的使用线程的方法。

假设你有一个带有动画的表单“ splashscreen”,而你的“ main”包含了你所有的应用程序代码。

 [STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Thread mythread;
mythread = new Thread(new ThreadStart(ThreadLoop));
mythread.Start();
Application.Run(new MainForm(mythread));
}


public static void ThreadLoop()
{
Application.Run(new SplashScreenForm());
}

在构造函数的主形式中:

 public MainForm(Thread splashscreenthread)
{
InitializeComponent();


//add your constructor code


splashscreenthread.Abort();
}

这样,启动画面将持续到您的主窗体加载的时间。

您的样板表单应该有自己的方式来动画/显示信息。 在我的项目中,我的启动画面开始一个新的线程,每 x 毫秒它改变他的主要图片到另一个略有不同的齿轮,给人一种旋转的错觉。

我的启动画面的例子:

int status = 0;
private bool IsRunning = false;
public Form1()
{
InitializeComponent();
StartAnimation();
}


public void StartAnimation()
{
backgroundWorker1.WorkerReportsProgress = false;
backgroundWorker1.WorkerSupportsCancellation = true;
IsRunning = true;
backgroundWorker1.RunWorkerAsync();
}




public void StopAnimation()
{
backgroundWorker1.CancelAsync();
}


delegate void UpdatingThreadAnimation();
public void UpdateAnimationFromThread()
{


try
{
if (label1.InvokeRequired == false)
{
UpdateAnimation();
}
else
{
UpdatingThreadAnimation d = new UpdatingThreadAnimation(UpdateAnimationFromThread);
this.Invoke(d, new object[] { });
}
}
catch(Exception e)
{


}
}


private void UpdateAnimation()
{
if(status ==0)
{
// mypicture.image = image1
}else if(status ==1)
{
// mypicture.image = image2
}
//doing as much as needed


status++;
if(status>1) //change here if you have more image, the idea is to set a cycle of images
{
status = 0;
}
this.Refresh();
}


private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
while (IsRunning == true)
{
System.Threading.Thread.Sleep(100);
UpdateAnimationFromThread();
}
}

希望这能帮到一些人。 对不起,如果我犯了一些错误。英语不是我的母语。

下面是创建启动画面最简单的方法:

首先,在 Form1.cs 代码的名称空间前添加以下代码行:

线程;

现在,按照以下步骤:

  1. 在应用程序中添加新表单

  2. 将这个新表单命名为 FormSplashScreen

  3. 在“后台图像”属性中,从其中一个文件夹中选择图像

  4. 添加进度条

  5. 在 Dock 属性中,将其设置为 Bottom

  6. 在 MarksAnimationSpeed 属性中,设置为50

  7. 在主窗体(默认名为 Form1.cs)中,创建以下方法:

     private void StartSplashScreen()
    {
    Application.Run(new Forms.FormSplashScreen());
    }
    
  8. 在 Form1.cs 的构造函数方法中,添加以下代码:

     public Form1()
    {
    Thread t = new Thread(new ThreadStart(StartSplashScreen));
    t.Start();
    Thread.Sleep(5000);
    
    
    InitializeComponent();//This code is automatically generated by Visual Studio
    
    
    t.Abort();
    }
    
  9. 现在,只要运行这个应用程序,它就会完美地工作。

其他的答案都没有给出我想要的答案。请继续阅读我对这个问题的解决方案。

我想要一个启动时从0% 不透明到100% 不透明的启动画面淡入,最短显示时间为2000毫秒(以允许完整的淡入效果显示)。一旦一切准备就绪,我希望启动画面再显示500毫秒,而主屏幕显示在启动画面后面。然后我希望启动画面消失,让主屏幕继续运行。

注意,我对 winform 使用了 MVP 模式。如果不使用 MVP,则需要对下面的示例进行一些简化。

长话短说,您需要创建一个从 ApplicationContext继承的 AppContext类。我已经把这个放在我的 Program.cs如下:

static class Program
{
/// <summary>
///  The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.SetHighDpiMode(HighDpiMode.SystemAware);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new AppContext());
}
}


public class AppContext : ApplicationContext
{
private IMainPresenter _mainPresenter;
private bool _ready;


public AppContext()
{
_ready = false;


using (ISplashPresenter splashPresenter = new SplashPresenter(new SplashView()))
{
Stopwatch sw = Stopwatch.StartNew();


_mainPresenter = new MainPresenter(new MainView());
_mainPresenter.Closed += MainPresenter_Closed;


new Thread(() =>
{
// !!! Do work here !!!


if (sw.ElapsedMilliseconds < 2000)
Thread.Sleep(2000 - (int)sw.ElapsedMilliseconds);


_ready = true;
})
.Start();


while (!_ready)
{
Application.DoEvents();
Thread.Sleep(1);
}


_mainPresenter.Show();


_ready = false;


new Thread(() =>
{
Thread.Sleep(500);


_ready = true;
})
.Start();


while (!_ready)
{
Application.DoEvents();
Thread.Sleep(1);
}
}
}


private void MainPresenter_Closed(object sender, EventArgs e)
{
ExitThread();
}
}

这里还有一些具体的实现细节我没有详细介绍,比如 ISplashPresenter实现 IDisposable以及如何管理淡入; 如果有足够多的人请求,我将编辑这个答案以包含一个完整的示例。