アプリケーションがあります。
最初にスプラッシュ画面とフォームを表示します。このスプラッシュは別のフォームを呼び出します。
問題:スプラッシュフォームが表示されているときに、スプラッシュの上で別のアプリケーションを開き、この新しく開いたアプリケーションウィンドウを最小化すると、スプラッシュ画面が白くなります。これを回避するにはどうすればよいですか?スプラッシュをはっきりと表示し、アプリケーションの影響を受けないようにしたい。
アプリケーションがあります。
最初にスプラッシュ画面とフォームを表示します。このスプラッシュは別のフォームを呼び出します。
問題:スプラッシュフォームが表示されているときに、スプラッシュの上で別のアプリケーションを開き、この新しく開いたアプリケーションウィンドウを最小化すると、スプラッシュ画面が白くなります。これを回避するにはどうすればよいですか?スプラッシュをはっきりと表示し、アプリケーションの影響を受けないようにしたい。
別のスレッドでスプラッシュ画面を表示する必要があります。現在、新しいフォーム読み込みコードがスプラッシュ画面のUIスレッドをブロックしています。
新しいスレッドを開始し、そのスレッドでスプラッシュ画面を作成してを呼び出しますApplication.Run(splash)
。これにより、そのスレッドで新しいメッセージポンプが開始されます。次に、準備ができたら、メインUIスレッドをスプラッシュ画面のUIスレッドにコールバックする必要があります(たとえば、Control.Invoke / BeginInvokeを使用)。これにより、スプラッシュ画面が自動的に閉じることができます。
重要なことは、間違ったスレッドからUIコントロールを変更しようとしないようにすることです。つまり、コントロールが作成されたスレッドのみを使用してください。
.NET フレームワークには、スプラッシュ スクリーンのサポートが組み込まれています。新しい WF プロジェクト (プロジェクト + 参照の追加) を開始し、Microsoft.VisualBasic を選択します。新しいフォームを追加し、それを frmSplash と呼びます。Project.cs を開き、次のようにします。
using System;
using System.Windows.Forms;
using Microsoft.VisualBasic.ApplicationServices;
namespace WindowsFormsApplication1 {
static class Program {
[STAThread]
static void Main(string[] args) {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
new MyApp().Run(args);
}
}
class MyApp : WindowsFormsApplicationBase {
protected override void OnCreateSplashScreen() {
this.SplashScreen = new frmSplash();
}
protected override void OnCreateMainForm() {
// Do your time consuming stuff here...
//...
System.Threading.Thread.Sleep(3000);
// Then create the main form, the splash screen will close automatically
this.MainForm = new Form1();
}
}
}
私はあなたがチェックしたいと思うかもしれない同様の問題を抱えていました。私が得たスタックオーバーフローの回答は私にとって完璧に機能しました-あなたは見てみたいと思うかもしれません.