web-dev-qa-db-ja.com

Windowsフォームアプリケーションでスプラッシュスクリーンを構築する方法

アプリケーションの起動時にスプラッシュスクリーンを数秒間表示する必要があります。誰もこれを実装する方法を知っていますか?

ヘルプに感謝します。

56
mironych

最初に、スプラッシュスクリーンを、イメージをその上に配置し、境界線のない不動のフォームとして作成します。最初に画面の中央に表示するように設定し、好きな色を付けます。これらはすべてデザイナー内から設定できます。具体的には、次のことを行います。

  • フォームのControlBox、MaximizeBox、MinimizeBoxおよびShowIconプロパティを「False」に設定します
  • StartPositionプロパティを「CenterScreen」に設定します
  • FormBorderStyleプロパティを「なし」に設定します
  • フォームのMinimumSizeおよびMaximumSizeを初期サイズと同じに設定します。

次に、表示する場所と却下する場所を決定する必要があります。これらの2つのタスクは、プログラムのメインスタートアップロジックの反対側で発生する必要があります。これは、アプリケーションのmain()ルーチン内、または場合によってはメインアプリケーションフォームのLoadハンドラ内にあります。大きな高価なオブジェクトを作成し、ハードドライブから設定を読み取り、一般的にメインアプリケーションの画面が表示される前に舞台裏で何かを行うのに長い時間がかかる場合。

次に、あなたがしなければならないのは、フォームのインスタンスを作成し、それをShow()し、スタートアップの初期化を行う間、それへの参照を保持することだけです。メインフォームが読み込まれたら、Close()します。

スプラッシュ画面にアニメーション画像が表示される場合、ウィンドウも「ダブルバッファリング」する必要があり、すべての初期化ロジックがGUIスレッドの外側で発生することを絶対に確認する必要があります(メインメインフォームのLoadハンドラーにロジックをロードする場合、BackgroundWorkerまたは他のスレッドルーチンを作成する必要があります。

76
KeithS

ガイドラインの手順は次のとおりです...

  1. フチ無しフォームを作成します(これがスプラッシュスクリーンになります)
  2. アプリケーションの起動時に、タイマーを開始します(数秒間隔で)
  3. スプラッシュフォームを表示する
  4. Timer.Tickイベントで、タイマーを停止し、スプラッシュフォームを閉じます-メインアプリケーションフォームを表示します

これを試してみて、行き詰まったら戻って、あなたの問題に関するより具体的な質問をしてください

7
musefan

スプラッシュ画面を作成するためのシンプルで簡単なソリューション

  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. 関数を作成する

    public void splash()
    {     
        Application.Run(new splash());
    }
    
  3. 以下のような初期化で次のコマンドを使用します。

    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/

5
Hani Mehdi

CodeProjectには A Pretty Good Splash Screen があります。

付属しています

  • フェードイン
  • プログレスバー
  • ステータスラベル
  • フェードアウト
  • ダブルクリックして閉じる

著者は最近、コードを見直して更新しました。これは本当にかなりの作業であり、優れたアイデアを持つ多くの異なる開発者間のコラボレーションです。

3
jp2code

スプラッシュを作成

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のスプラッシュスクリーンの機能が組み込まれていることを知っておく価値があります。Windowsフォームアプリのプロジェクトプロパティを開き、[アプリケーション]タブを見ると、 : "オプションが下部にあります。スプラッシュスクリーンとして表示するアプリ内のフォームを選択するだけで、アプリの起動時に表示され、メインフォームが表示されたら非表示になります。

上記のようにフォームを設定する必要があります(正しい境界線、配置、サイズ設定などを使用)

2
tomRedox

メインプログラムフォームを表示する準備ができるまで表示されるスプラッシュスクリーンが必要だったため、タイマーなどは役に立ちませんでした。また、できるだけシンプルにしたかったのです。私のアプリケーションは(省略形)で始まります:

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

たぶん私は何かを見逃していますが、これはスレッドやタイマーをいじるよりもずっと簡単に思えます。

1
AndrewB

最初に、ボーダー付きまたはボーダーなしのフォームを作成する必要があります(これらの場合はボーダーレスが推奨されます)

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

メインでは、それを使用する必要があります

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

答えるのに少し遅れるかもしれませんが、私のやり方を共有したいと思います。 winformアプリケーションのメインプログラムでスレッドを使用して簡単な方法を見つけました。

アニメーション付きのフォーム「スプラッシュスクリーン」と、すべてのアプリケーションコードを含む「メイン」があるとします。

 [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();
        }
    }

これが一部の人々に役立つことを願っています。間違いを犯した場合は申し訳ありません。英語は私の第一言語ではありません。

0
Ornithorix